服务器虚拟机性能优化的核心在于让每个虚拟CPU、虚拟内存和虚拟磁盘都能贴近物理硬件的真实处理节奏,建议优先从CPU调度、内存分配、磁盘I/O与网络虚拟化四个层面入手,而不是盲目堆硬件配置。
服务器虚拟机性能优化从哪入手
老杨的机房里有台物理服务器,跑着一个数据库虚拟机、两个Web虚拟机,最近业务量上来,虚拟机个个都喊卡,他第一反应是加内存,结果加完还是卡,这种情况很多见,虚拟机性能问题往往不是单一资源短缺,而是虚拟化层的调度策略与物理资源产生了错位。
CPU虚拟化:别让vCPU抢破头
虚拟机的CPU性能损耗,很大一部分来自vCPU对物理核的争抢,业内专家指出,当多个vCPU同时请求物理核,而宿主机没有做好亲和性绑定,调度器就得频繁切换上下文,损耗直接翻倍。
实操层面,三件事值得重点做:
- 启用CPU亲和性绑定,用
virsh vcpupin把特定vCPU固定到指定物理核 - 关闭宿主机的自动NUMA平衡,避免vCPU跨内存节点访问
- 生产环境关闭CPU过热保护降频,确保物理核稳定运行在标称频率
对于跑数据库的虚拟机,绑定比不绑定性能差距相当大,特别是在八核以上的高负载场景,如果虚拟机没有绑定,你会在宿主机上看到所有CPU使用率都很平均,但虚拟机内部却慢如蜗牛,这就是典型的调度抖动。
内存虚拟化:回收不能靠气球
很多运维人员对内存气球驱动有误解,以为它在帮虚拟机释放内存,气球驱动在多数场景下是在帮宿主机回收内存,回收动作本身就会引发虚拟机内部的内存回收压力,导致SWAP频繁。
这里给出的建议比较直接:
- 物理机内存充足的场景,直接关掉气球驱动,用
memory back保证预留 - 开启透明大页,特别是对数据库这类大内存连续分配场景,TLB命中率能明显提升
- 避免虚拟机SWAP分区落在虚拟磁盘上,尽量锁内存或调整
swappiness参数
虚拟机卡顿怎么解决?磁盘和网络才是重灾区
要说虚拟机性能优化中最常被忽略的地方,磁盘I/O和虚拟网络绝对排前两位,CPU和内存的问题,大部分可以通过分配策略调整解决,但磁盘和网络一旦设计不合理,业务高峰期会直接掉链子。
磁盘I/O:中断合并和队列深度要盯紧
虚拟磁盘的瓶颈不在容量,而在I/O路径的长度,每一次写操作从虚拟机到物理磁盘,要经过虚拟磁盘设备、宿主机内核、物理驱动三层,每一步都有排队。
行业共识认为,虚拟磁盘的优化要看三个层面:
- 设备模型选择:KVM用
virtio-blk,VMware用pvscsi,不要用默认的IDE或SATA模拟 - I/O调度器切换:宿主机磁盘调度器从
cfq换成none或noop,让物理硬件自己处理排序 - 队列深度调整:每个virtio队列的深度从默认128调高到512,对数据库这类随机写操作有直接收益
可以验证的操作路径是:在宿主机上执行lsblk --scsi查看设备模型,如果识别出virtio,说明模型正确,接着用cat /sys/block/vda/queue/scheduler确认调度器状态,这两个命令现场就能跑,结果一目了然。
对于超融合或分布式存储的虚拟机,还有一点要补充:多路径配置不要用默认的轮询算法,多数超融合平台推荐service-time或queue-depth模式,前者照顾延迟,后者照顾吞吐。
网络虚拟化:别让软中断吃满第一个核
网络卡顿的典型症状是:虚拟机内ping宿主机延迟正常,但业务连接吞吐上不去,这通常不是带宽不够,而是收包路径太长,软中断全压在一个物理核上。
解决方案按优先级排列:
- 使用
virtio-net多队列,队列数对齐vCPU数,例如四核就开四个队列 - 开启
vhost-net卸载,让报文处理从QEMU进程转移到内核线程 - 宿主机网卡开启RSS或RPS,把收到的包散列到多个物理核
使用KVM平台的朋友,可以试一下把mq参数加到网卡模型上,比如netdev配置里加上mq=on,配合四队列,压测时网络吞吐会好看很多,这是多年来社区验证过的有效手段。
监控与调优节奏:先定位再动手
有些运维朋友喜欢一上来就改参数,这里改一下,那里改一下,最后说不清是哪个动作起了作用,虚拟化环境的问题定位,讲究的是用监控数据说话,按流程操作。
推荐的做法是固定一套巡检流程,每季度走一遍:
- 宿主机层面看CPU的
steal指标,它直接代表vCPU等待物理核的时间 - 虚拟机层面看磁盘
await,等段时间超过30毫秒就该查宿主机I/O栈了 - 网络层面看物理网卡的
rx_dropped,有丢包就说明环形队列缓冲区不够
为了更直观,下面列出几个关键指标和排查方向:
| 指标 | 位置 | 数值提示 | 排查方向 |
|---|---|---|---|
| CPU steal | 宿主机/虚拟机 | 持续高于10% | CPU绑定与超分配策略 |
| 磁盘 iowait | 虚拟机内部 | 偏高 | 存储模型与调度器 |
| 网卡 drop | 宿主机物理网卡 | 持续增加 | 队列深度与RSS配置 |
| 内存 THP | 宿主机 | 分配缓慢 | 碎片整理与预留策略 |
这里要特别提一个容易踩坑的地方:监控数据要在业务低峰期采集基线值,有些参数平时看着正常,一到大促就崩,就是因为基线值没建对,拿业务高峰期的问题去对比非高峰的数据,自然找不出规律。
跑批任务的虚拟机和白天的线上业务虚拟机,优化方向完全不同,跑批虚拟机可以放开CPU配额,接受高峰期的I/O抢占;线上虚拟机则要保证资源预留,宁可空闲也不允许被抢占。务必备注好每台虚拟机的业务属性,再制定差异化策略。
这个优化工作本质上是个持续调整的过程,物理硬件不变,但虚拟机的配置、宿主机内核参数、业务负载曲线都在变,隔一个季度回头看看当时的监控数据,可能已经不适合现在的业务模型了。
到最后,还是要回到开头那句话:虚拟机性能优化的核心,是让虚拟化层不再干扰物理硬件的原生处理能力,无论是CPU绑定、内存预留,还是磁盘队列、网络多队列,都是在为这个目标服务,先把现有物理资源榨干,再考虑下一步的扩容方案,这样虚拟机跑业务,效率自然就上来了。
服务器虚拟机性能优化常见问题解答
物理机配置很高,为什么虚拟机还是慢?
先查宿主机CPU的steal值,再看宿主机的内存是否被其他虚拟机占用,然后确认虚拟磁盘是不是和别的虚拟机共享了同一块物理磁盘,多数情况下都是资源争抢问题,配置高不代表虚拟机能独享。
虚拟机的SWAP分区应该放在哪里?
不建议放在虚拟磁盘上,更不建议放在共享存储上,最好在宿主机层面给虚拟机预留足够内存,尽量关闭虚拟机内部SWAP,真需要SWAP时放在独立的SSD本地盘上更靠谱。
超线程对虚拟机性能有帮助吗?
对单虚拟机单vCPU的小负载有帮助,对高并发数据库虚拟机反而可能造成缓存争抢,生产环境跑核心业务的虚拟机,建议关掉宿主机超线程或者将vCPU绑定到同一个物理核的相邻逻辑核上。