想获得虚拟机进程的具体信息,最直接的方法有两个:一是登录宿主机用虚拟化平台自带命令查看虚拟机的整体运行状态,二是登录虚拟机内部用常规进程管理工具查看客户机自身的进程列表。两者的操作对象不同,前者看到的是虚拟机在宿主机上的资源占用,后者看到的是操作系统里正在跑的应用程序进程,下文按平台划分,把常用命令和排查思路逐一梳理清楚。
虚拟机进程查看命令:先搞懂宿主层与客户机层的区别
很多刚接触虚拟化的人容易把这两层混在一起,宿主机上的“虚拟机进程”,实际上是指支撑这台虚拟机运行的虚拟化组件进程,以KVM为例,每台运行中的虚拟机在宿主机上对应一个或多个qemu-kvm进程;以VMware为例,每台ESXi上的虚拟机对应一个vmx进程,这些进程负责向虚拟机提供CPU、内存、磁盘和网络设备模拟,客户机内部的进程则完全不同,它是由虚拟机操作系统自己管理的,比如Linux里的nginx、MySQL,Windows里的svchost.exe、explorer.exe,宿主机默认看不见。
宿主机层面的虚拟机进程长什么样
你平时在Linux服务器上敲ps -ef看到几百个PID,其中归属某个虚拟机的进程通常会带有虚拟机名称参数。
ps -ef | grep qemu
输出里会看到类似-name vm_nginx这样的标识,这就是那台虚拟机的名字,CPU和内存的实时占用可以用top或htop查看,注意%CPU列如果持续很高,意味着虚拟机计算负载不低,在VMware ESXi的宿主机上,对应的命令是:
esxcli vm process list
它会输出每个虚拟机的World ID、Display Name和进程PID。
客户机内部的标准进程查看方式
进入虚拟机终端后,操作和普通服务器完全一样,Linux下用ps -ef或ps aux查看完整进程列表,用top或htop看实时排序,Windows下打开任务管理器,或者用PowerShell执行:
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 20
这些不需要在宿主机装任何额外工具,属于常规系统操作。
虚拟机进程信息获取方法:主流平台具体操作指令
不同虚拟化平台提供的查询手段差异较大,下面的操作路径按平台整理,你可以直接对照使用,行业共识认为,一个运维人员至少要熟练一套虚拟化平台和一套物理机监控工具,这样在混合环境中才不会手忙脚乱。
KVM虚拟机进程查看命令与资源统计
KVM环境通常搭配libvirt管理,核心工具是virsh,先把正在运行的虚拟机列出来:
virsh list --all
然后针对某个虚拟机查看CPU和内存配置:
virsh dominfo vm_nginx
查看虚拟机的vCPU使用情况:
virsh vcpuinfo vm_nginx
需要实时观察虚拟机内部负载时,使用virsh top可以像top命令一样刷新显示各虚拟机的CPU、内存和磁盘读写,如果只想确认虚拟机是否处于运行状态,virsh list一行就够了。
ESXi虚拟机进程查看命令与vCenter联动
ESXi的宿主机层面查看进程,优先用esxcli vm process list,要强制终止某个无响应的虚拟机进程,记住这个操作:
esxcli vm process kill -t=soft -w=<World ID>
soft模式先尝试正常关机,不行再换hard模式,通过vCenter管理时,你可以直接登录vCenter的Web界面,在“虚拟机”选项卡里看到每个虚拟机的CPU、内存、磁盘延迟数据,命令行方式在vCenter环境中同样适用,但需要先通过ssh登录到ESXi主机,借助esxtop可以查看实时性能数据,这个命令类似Linux的top,按c查看CPU,按m查看内存,按d查看磁盘。
Hyper-V虚拟机进程查看命令与Windows生态
Windows环境下的Hyper-V使用PowerShell管理最方便,查看所有虚拟机的状态:
Get-VM
查看虚拟机的启动信息、配置版本和状态:
Get-VM vm_name | Format-List
查看虚拟机的CPU使用情况:
Get-VM vm_name | Get-VMProcessor
Windows宿主机的进程列表里,每个虚拟机对应一个vmwp.exe进程,你可以用Get-Process vmwp查看所有虚拟机的宿主机进程,但要注意PID和虚拟机的对应关系需要通过Get-VM -Id反向查询,因为从VM名称到宿主机进程PID没有直接一一对应的简单命令,另一个实用操作是通过Get-VM vm_name | Select-Object Id, CPUUsage, MemoryAssigned快速获取虚拟机的当前资源用量。
Proxmox VE与其他平台的补充
Proxmox VE越来越常见,它基于KVM,但自带Web面板,CLI下用qm list查看所有虚拟机状态,用qm status <VMID>查看单台虚拟机详细信息,如果要看资源使用,通常用pvesh get /nodes/<node>/qemu/<vmid>/status/current,输出JSON格式,适合脚本二次处理,国内不少机房托管场景里,管理员会在宿主机上安装jq工具配合该命令做监控报警。
| 平台 | 查询虚拟机的命令 | 关键字段 |
|---|---|---|
| KVM/libvirt | virsh list –all | State, Name |
| ESXi | esxcli vm process list | World ID, Display Name |
| Hyper-V | Get-VM | State, CPUUsage, MemoryAssigned |
| Proxmox VE | qm list | VMID, Status |
拿到虚拟机进程信息后做什么:排查场景与操作方法
知道命令只是第一步,关键是如何解读输出,并据此判断虚拟机是否真的出了问题。
虚拟机高CPU占用怎么排查:从st列到vcpuinfo
当你用top进入虚拟机内部,看到某个用户态进程CPU占用达到90%以上,先别急着下结论,切回宿主机再执行top,观察CPU的st列,这个字段代表虚拟机里的CPU被宿主机上的其他虚拟机“偷走”的时间,如果st值很高,说明虚拟机的外层CPU资源已经饱和,即使虚拟机内部进程没问题,整体性能也会下降,这时应查看virsh vcpuinfo确认vCPU映射情况,必要时调整虚拟机的vCPU数量,或者把虚拟机迁移到负载更低的宿主机上。
业内专家指出,大多数“虚拟机卡顿”问题本质上是宿主机资源竞争导致的,因此在排查虚拟化性能问题时,建议开启宿主机终端和虚拟机终端两个窗口,同步观察,而不是只盯着客户机内部的进程列表。
虚拟机卡顿怎么排查:内存与磁盘IO瓶颈定位
内存不足时,Linux会大量使用swap,表现是top中的wa偏高或free内存接近零,Windows系统则表现为磁盘活动指示灯长亮,任务管理器物理内存占用接近100%,磁盘IO瓶颈比较隐蔽,推荐在宿主机上执行iostat -x 1,重点看%util列,超过80%说明虚拟机的磁盘IO已经接近极限,在VMware环境里,esxtop的d视图可以看到CMDS/s和DAVG/cmd延迟,如果延迟超过20毫秒,就需要考虑把虚拟机的vmdk迁移到更快的存储池。
多台宿主机之间的横向对比操作
当你有多台物理机,想知道哪台负载高、哪台空间大,可以写一个简短的shell循环,例如在KVM集群中:
for host in host01 host02 host03; do
ssh root@$host "virsh list --all | wc -l; uptime"
done
比较输出值就能看出哪台机器上的虚拟机数量最多、最近1分钟负载最高,Hyper-V集群可以用Get-ClusterNode | ForEach-Object { Get-VM -ComputerName $_ }做类似统计。
操作虚拟机进程时的常见误区与注意事项
不要混淆宿主进程和客户机进程
最常见的错误是在宿主机上执行top,看到一个CPU跑满的qemu-kvm或vmx进程,就直接把它当成虚拟机内部某个进程的异常,这两个进程消耗的CPU总量包含该虚拟机所有操作系统的CPU开销,你需要在虚拟机的系统里再定位具体是哪一个应用占用了资源,对很多企业来说,一台宿主机跑了几十台业务虚拟机,内部应用的情况千差万别,如果只在宿主机层面看到“某个进程很忙”就重启虚拟机,可能让正在处理的业务中断。
不要在未确认负载时直接重启虚拟机
如果虚拟机进程异常退出,比如KVM的qemu进程消失、Hyper-V的vmwp进程被终止,先去确认主机的CPU、内存、磁盘是否已经耗尽,重启虚拟机前,至少应记录virsh list或Get-VM当前的完整输出,并抓取虚拟机的当前设备状态,虚拟机无响应时,优先尝试系统内关机和电源重置,在裸金属服务器上跑虚拟机和在公有云上跑虚拟机,处理思路有明显差异:云服务器价格相对便宜,多数人会直接重装系统;物理宿主机上的虚拟机则更值得花时间从进程信息入手逐步排查。
安全监控时的特别提醒
在云环境中,虚拟机进程信息可能涉及多租户隔离,如果你使用的是共享型云主机,通常只能查看自己实例内部的进程状态,宿主机层级的virsh list和esxcli命令对你不可用,这是平台限制,不代表操作有问题,自建机房运维则不存在这个限制,管理员可以完整掌握所有虚拟机的进程级别数据,北京、上海、广州等城市的数据中心托管业务中,管理员经常会遇到客户要求“帮我看看那台虚拟机为什么跑得慢”,这时候流程化的进程排查步骤就派得上用场了。
Q&A:关于虚拟机进程的各种典型问题
Q1:为什么在宿主机上执行ps -ef | grep qemu看不到任何KVM进程?
如果宿主机上确实有虚拟机在运行,那大概率是因为你的账号没有权限查看其他用户的进程,KVM虚拟机可能由其他系统账号启动,可以先用virsh list确认虚拟机是否真的处于running状态,再切换到root用户或用sudo执行查看。
Q2:虚拟机内部一切正常,但宿主机上的进程经常掉线,是什么原因?
先检查宿主机负载和高可用配置,多数情况下是宿主机内存不足,触发了Linux的OOM Killer,强制终止了qemu进程,或者主机端的高可用策略检测到系统无响应后自动迁移了虚拟机,建议翻查宿主机上的/var/log/messages或ESXi的/var/log/vmkernel.log,留意OOM或heartbeat相关的错误记录。
Q3:如何判断一个虚拟机是否发生了CPU抢占?
在虚拟机内部执行top,看st列,这个字段表示虚拟机等待宿主机CPU的时间,当st值持续超过10%且虚拟机内部负载稳定时,基本可以判定CPU资源被抢占,同时到宿主机上运行top查看该虚拟机的进程CPU占用,如果宿主CPU已满而虚拟机内部us并不高,说明宿主机本身已经过载,解决方法是给虚拟机迁移或扩容物理机。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/617686.html





