Ubuntu虚拟机卡顿、繁忙甚至假死时,先按住Ctrl+Alt+F2切换到字符终端,用top按住P键按CPU排序、按M键按内存排序看进程,再用iostat看磁盘IO,最后看物理机负载,多数情况下不用重启,找准瓶颈才是根治办法。如果连字符终端都切不过去,再考虑从宿主机强制重启,但那是最后手段,会丢失未落盘数据,而且问题大概率还会复现。
ubuntu虚拟机卡顿怎么解决先分清是虚拟机忙还是物理机忙
很多人在遇到Ubuntu虚拟机卡顿时的第一反应是"配置不够",甚至直接开新配置的实例重装系统。虚拟机卡顿往往不是单一原因,至少可以从虚拟机内部和宿主机外部两个维度来看,行业共识认为,虚拟机性能问题中,有相当一部分不是Guest系统本身的问题,而是宿主机资源争抢或虚拟化层配置不当造成的。
用三个命令快速定位瓶颈
登录Ubuntu虚拟机,依次执行以下操作,每一步都花不到一分钟:
- 运行
top,看%Cpu(s)这一行,后面有us(用户态)、sy(内核态)、wa(等待IO)三个关键值,如果wa数值较高,说明磁盘或网络IO在拖后腿;如果us或sy非常高,大概率是计算密集型进程或内核态频繁切换。 - 运行
free -h,看内存。available如果比total小很多,且Swap的used值不是0,说明内存已经打到交换分区去了,这也是典型的"忙"。 - 运行
iostat -x 1,重点看%util和await。%util长期接近100%,说明磁盘已经顶满;await数值高,说明IO队列过长。
别忘了看一眼宿主机
如果你有宿主机权限,直接在宿主机上执行top或htop,看所有虚拟机的QEMU进程占用了多少CPU。一个常见的坑是:宿主机已经过载,但每个虚拟机里的负载看起来都不算高,此时需要关注的是%steal这一列,如果它一直超过10%,说明宿主机CPU核数不够分,你加多大内存都没用,只能减少虚拟机数量或提升物理机配置,虚拟机里看到的CPU时间不是物理机的全部,被抢占的时间是藏在steal里的。

ubuntu虚拟机cpu占用过高怎么办从进程排查到参数调优
top里按下P键,进程按CPU占用从高到低排序,这一步能直接告诉你谁在烧CPU。
揪出隐藏的CPU大户
常见的高占用进程和应对思路:
systemd-journald:日志积累过多时会出现持续高CPU,检查/var/log/journal目录体积,用journalctl --vacuum-size=200M限制日志大小,这是Ubuntu系统里相当容易被忽略的一个原因。php-fpm或python进程:如果是运行网站的虚拟机,说明并发请求已经超过进程池上限,需要调低pm.max_children,或者上缓存(如OPcache、Redis)。vmtoolsd:VMware虚拟机的Tools服务偶尔会陷入死循环,如果它的CPU占用常年在20%以上,尝试在虚拟机里重启该服务:systemctl restart vmtoolsd。conky或桌面特效进程:桌面版Ubuntu特有的问题,gnome-shell偶尔会吃满一个核,关闭不用的扩展或窗口动画能明显改善。
调整CPU配额和亲和性
如果某几个进程确实需要长期占用大量CPU,不要一味增加虚拟机核数,给你两个更实际的做法:
- 给虚拟机绑核,在宿主机上用
virsh vcpupin将虚拟机的vCPU固定到特定物理核上,避免上下文切换抖动,这能解决低延迟场景下的卡顿,但需要你确认物理机的NUMA拓扑,别让vCPU跨Node访问内存,否则性能损失更大。 - 调整CPU权重,在宿主机上对特定虚拟机限制CPU份额,用
virsh schedinfo <vm_name> --set cpu_shares=2048,数值越高,CPU调度优先级越高,相反,如果是后台测试虚拟机占满了CPU导致前台虚拟机卡顿,调低它的cpu_shares效果立竿见影。
ubuntu虚拟机性能调优磁盘IO和内存配置是常见盲区
CPU问题好排查,磁盘IO问题需要更多耐心,特别是虚拟磁盘的IO性能与物理机硬盘类型、缓存策略和文件系统挂载参数高度相关。
磁盘慢的三种典型场景
- 虚拟机里大文件复制偶尔正常,但小文件读写频繁时明显卡顿,这是典型的随机IO性能瓶颈

,在机械硬盘宿主机上尤为突出,解决方案是给虚拟机磁盘改用raw格式(或预分配QCOW2),同时检查宿主机硬盘剩余空间是否充足。
iostat显示%util不高,但应用响应就是慢,这时观察/sys/block/vda/queue/scheduler(vda是你的虚拟磁盘名),如果是none,可能没启用virtio多队列,需要在宿主机上开启多队列:virsh edit,给<driver name='qemu' type='virtio' queues='4'/>,改完重启虚拟机,cat /sys/block/vda/queue/nr_requests可看到变化。- 磁盘快照累积导致读写放大,每创建一个快照,后续磁盘写入都要先复制旧数据,快照链越长,性能衰退越明显,建议定期合并快照,删除不再需要的分支。
内存参数调整让持续负载更稳
内存不足时,即使物理内存还有剩余,Ubuntu也可能主动使用Swap,修改/etc/sysctl.conf把vm.swappiness从默认的60调低到10,让系统优先使用物理内存。给虚拟机分配超大内存页(HugePages)也是提升内存密集型应用性能的有效手段,但需要宿主机支持并预留连续内存,适合数据库等特定负载,普通桌面用途不必折腾。
不重启的排查顺序先看虚拟化层配置再看虚拟机内部
排查顺序会直接影响定位速度,我推荐按这个固定流程走:
- 确认物理机负载是否过高,是否存在其它虚拟机抢资源,这一步可以在宿主机上用
virt-top实时查看各虚拟机状态。 - 登录目标虚拟机,用
uptime看load average,超过CPU核数一两倍说明确实忙,但结合top看是用户态还是IO等待。 - 检查虚拟化层配置。
virsh dominfo <vm_name>确认最大内存和当前内存是否一致;virsh vcpucount <vm_name>确认在线CPU数。 - 检查系统日志
dmesg -T | tail -50,因为OOM Killer杀掉进程、磁盘只读错误、SCSI命令超时这类偶发问题,大都会在dmesg里留下线索。 - 如果以上都没问题,用
perf top采样几秒钟,看内核热点在哪个函数上,能精确指出是网络软中断还是页表操作。
网络引发的假"繁忙"
还有一个容易漏掉的因素:

网卡中断总在一个CPU核上,如果top里某个软中断进程(ksoftirqd)长期占用100%,且虚拟机网络流量不大,多半是virtio网卡的队列没多开,在宿主机上查看网卡队列数(ethtool -l ens3),如果Combined值只有1,在虚拟机XML里为<interface>添加多队列参数后重启。
什么情况下必须重启虚拟机
排查顺序走完,只有三种情况建议直接重启:
- 内核死锁或不可中断的D状态进程堆积,
kill -9都无法解决,并且系统日志中出现大量blocked for more than 120 seconds信息。 - 物理机要关机维护,且虚拟机的离线快照不可用,只能重启配合迁移。
- 虚拟机的根文件系统损坏,但你现在没有远程救援环境,重启后进入恢复模式是最后选择。
Ubuntu虚拟机繁忙是个综合性问题,不单是"内存不够"或"CPU不行"一句话能概括的。 先定位、再调整、最后才考虑重启,才能避免治标不治本。
关于ubuntu虚拟机频繁卡顿的Q&A
ubuntu虚拟机卡顿怎么解决才能不影响已保存的数据?
先做镜像快照,再执行排查操作。 无论哪种调优操作,都可能涉及服务重启,快照之后,你可以放心地修改/etc/sysctl.conf或调整虚拟化参数,如果修改后系统无法启动,能靠快照回滚,多数情况下,卡顿问题可以通过调参数解决,不影响现有数据。
ubuntu虚拟机cpu占用不高但卡顿是什么原因?
这种情况优先查磁盘IO和内存交换。iostat观察%util是否在100%附近,free看Swap是否被占用,宿主机磁盘空间告急也会让虚拟磁盘的写性能骤降,df -h检查宿主机的根分区使用率,如果宿主机用了网络存储(NFS/Ceph),网络延迟也会把"慢"传导给虚拟机。
调整虚拟机vCPU的数量之后,ubuntu虚拟机性能会立竿见影提升吗?
分场景,如果是CPU密集型计算任务且宿主机资源充足,增大vCPU数量确实能缩短任务执行时间,但如果是单线程应用或IO瓶颈,增加vCPU没有直接帮助,行业专家指出,虚拟机调优的第一步永远是确认瓶颈在哪个子系统,而不是盲目堆资源。