虚拟机硬件配置的调整核心是“按负载定配比、按瓶颈调参数”:CPU 先看并发与单核性能,内存决定单机密度上限,磁盘 IO 往往才是真正的短板,网络优先上半虚拟化驱动,参数优化则围绕 CPU 绑定、大页内存、IO 调度器和缓存策略四项展开。
配置之前先想清楚:调优是把参数调到匹配负载
很多人一上手就想把虚拟机的核数和内存拉到最大,结果宿主机资源被透支,所有虚拟机都卡顿,虚拟机不是物理机的简单切分,它以共享宿主机的 CPU 时间片、内存页和 IO 队列为基础,各项资源之间相互制约,先看瓶颈落在哪,再决定调哪个参数,比统一提高配置要有效得多。
决策顺序建议按下面这条路径走:
- 先用
top、vmstat 1、iostat -x 1看宿主机整体占用,确认是 CPU 争抢、内存交换还是磁盘等待。 - 进虚拟机内部重复同样的观察,判断卡顿来自客户机内部还是宿主机层。
- 只有定位到具体瓶颈,才去动对应的虚拟化参数,否则调了也看不到收益。
虚拟机CPU核心数分配多少合适?先分清物理核心和虚拟核心
vCPU 超额分配有安全边界
业内普遍经验是 vCPU 与物理逻辑核心的比例控制在 2:1 到 4:1 之间,超出这个范围,CPU 调度延迟会明显上升,判断是否已经超标的直接指标是 CPU 就绪时间,VMware 里看 %RDY,KVM 里看 virsh domstats 输出的 vcpu.X.delay,一旦持续高于 5%,说明虚拟机在排队等物理核心,加 vCPU 只会让排队更长。
CPU 型号要透传给客户端
KVM 默认给虚拟机一个较老的通用 CPU 模型,某些指令集被屏蔽,跑数据库或编译任务会莫名变慢,把 CPU 模式改成 host-passthrough,让客户机直接看到宿主机的完整指令集:
virsh edit vm1 # <cpu mode='host-passthrough' check='none'/>
改完需要关机重启生效,热迁移场景则改用 host-model 保持兼容性。
关键业务做 CPU 绑定
对延迟敏感的服务,让 vCPU 固定在指定物理核上,避免调度器来回迁移带来的缓存失效:
virsh vcpupin vm1 0 2 virsh vcpupin vm1 1 3 virsh emulatorpin vm1 4-5
绑定前先用 numactl --hardware 查看 NUMA 拓扑,跨 NUMA 节点访问内存的延迟明显高于本地节点访存,把虚拟机的 vCPU 和内存都放在同一个节点上,是最省钱的一次性能提升。
内存配置:分配多了浪费,分配少了交换
把宿主机交换关掉,把客户机交换管好
宿主机一旦开始用 swap 给虚拟机内存做交换,性能会断崖式下跌,宿主机上把 vm.swappiness 调到 10 甚至更低,是行业共识做法,客户机内部则相反,数据库类实例建议 vm.swappiness 保持较低值,让热数据留在内存里;Web 类实例可以维持默认。
大页内存能省下不小的 TLB 开销
内存密集型虚拟机开启透明大页,把模式设为 madvise,再由业务显式申请,比全局 always 更可控:
cat /sys/kernel/mm/transparent_hugepage/enabled echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
对 Oracle、Redis 这类大内存实例,直接在宿主机预留 2M 大页,在虚拟机 XML 里声明 <memoryBacking><hugepages/></memoryBacking>,效果比依赖透明大页更稳定,注意大页是预分配的,宿主机看不到收益时不要盲目开启,否则内存会被白白占住。
内存气球驱动别关
气球驱动让宿主机在内存紧张时回收客户机闲置页,是维持单机部署密度的重要机制,装了 VMware Tools 或 virtio-balloon 驱动的虚拟机,优先开启这一能力。
存储与网络:多数性能问题其实出在这两处
磁盘缓存策略选错,等于白调
KVM 的磁盘缓存有四种常见组合,选择取决于数据安全性要求:
| cache 模式 | 数据安全性 | 适用场景 |
|---|---|---|
none + io=native |
高,直写落盘 | 数据库、生产业务 |
writeback |
一般,断电可能丢数据 | 临时测试、可重建环境 |
directsync |
最高 | 强一致要求场景 |
unsafe |
低 | 一次性批处理 |
生产环境推荐 cache=none 加 io=native,再给磁盘配独立 IO 线程:
<driver name='qemu' type='qcow2' cache='none' io='native' discard='unmap'/> <iothreads>2</iothreads>
qcow2 适合配快照,raw 适合纯性能场景,qcow2 首次创建时用 qemu-img create -f qcow2 -o preallocation=metadata 预分配元数据,能减少写入时的碎片化。
网络用半虚拟化驱动,多队列别忘开
virtio-net 加 vhost-net 是 KVM 环境下成熟的组合,比模拟 e1000 网卡的中断开销低得多,多核虚拟机把队列数开到和 vCPU 数量接近:
<interface type='network'> <model type='virtio'/> <driver name='vhost' queues='4'/> </interface>
客户机内还要确认多队列已经生效,用 ethtool -l eth0 查看,再按需调整 ethtool -L eth0 combined 4。
云服务器和本地虚拟机性能对比:能调的和调不了的
这是选型时绕不开的问题。本地自建虚拟机的优势在于参数完全可控,CPU 绑定、NUMA 亲和、大页内存、IO 调度器都能改;云服务器的优势在于弹性,但绝大多数调优参数不开放给租户。
无论在哪跑,下面这几个参数都值得检查:
- CPU 就绪时间:云上看监控面板的 CPU 使用率与负载偏离程度,偏离大往往意味着宿主争抢。
- 磁盘 IOPS 上限:云盘的性能通常与容量档位挂钩,容量买小了,IOPS 天花板就低。
- 网络多队列:部分云厂商默认关闭,需要在控制台或镜像内开启。
- 突发性能实例:积分耗尽的实例会被限频,不适合持续性负载。
业内专家指出,云上选型更接近“挑规格”而非“调参数”,把精力放在规格匹配和监控告警上,比钻研系统内核参数收益更高。
开发测试环境虚拟机配置推荐:别照搬生产规格
研发和测试环节的虚拟机,追求的是启动快、能克隆、可回滚,而不是跑分。
- 日常开发机:4 vCPU、8GB 内存、50GB 磁盘,开启快照,编译任务重的给到 8 vCPU。
- 集成测试环境:8 vCPU、16GB 内存,磁盘换 NVMe,避免用例跑一半卡在 IO。
- CI 构建节点:多核优先,单核性能同样重要,构建任务对单线程延迟敏感。
克隆出来的虚拟机记得重新生成机器标识和 MAC 地址,否则在同一网段会出现冲突,KVM 下用 virt-sysprep 清理模板,能省掉不少重复配置。
虚拟机性能优化参数有哪些?一份可直接照抄的清单
宿主机层
sysctl -w vm.swappiness=10 sysctl -w fs.aio-max-nr=1048576 sysctl -w net.core.somaxconn=4096
同时确认 irqbalance 处于运行状态,高负载网卡场景可手动把中断绑到不同物理核。
客户机层
- 文件句柄上限:
/etc/security/limits.conf里调整nofile。 - 网络队列:
net.core.somaxconn、net.ipv4.tcp_tw_reuse按业务并发调整。 - 磁盘调度器:NVMe 盘用
none,SATA/SAS 盘在虚拟化场景下mq-deadline通常比cfq更稳。
监控与验证
调完必须有数据验证,否则只是心理安慰:
iostat -x 1 # 看 await 和 %util virsh domstats vm1 # 看 vCPU 延迟和内存气球状态 fio --name=test --rw=randwrite --bs=4k --size=1G --numjobs=4 --runtime=60 --group_reporting
改动一次只调一个参数,记录前后对比,这是排查性能问题最朴素也最有效的方法。
预算怎么算:虚拟机价格与性能的性价比拐点
本地自建的成本不只在硬件,还包括机房电费、带宽、UPS 和运维人力,一台能稳定承载十余台中等规格虚拟机的宿主机,三年总拥有成本折算下来,未必比按需付费的云主机便宜,但可控性更强,云上则要留意加核比加内存贵的普遍规律,CPU 密集型业务优先选计算型规格,内存密集型优先选内存型,避免在通用型规格上为用不到的 CPU 付费。
虚拟机硬件配置与性能优化Q&A
给虚拟机分配的 vCPU 越多,运行就越快吗?
不是,vCPU 超过物理核心承载能力后,调度器需要频繁切换上下文,缓存命中率下降,性能反而倒退,判断依据是 CPU 就绪时间,持续偏高就该减少 vCPU 或迁移负载。
虚拟机磁盘写入慢,最常见的原因是什么?
按出现频率排,依次是缓存模式选了 writeback 但底层存储本身慢、qcow2 未预分配导致写放大、IO 线程不足造成队列积压,先用 iostat -x 1 看 await 和 %util,再对照上文的缓存策略表逐项排查。
虚拟机内部看到的 CPU 主频为什么和宿主机不一致?
这是 CPU 模型透传未开启的典型表现,客户机读到的是虚拟化层模拟的通用型号,指令集被裁剪,主频信息也不准确,改为 host-passthrough 后,客户机才能看到宿主机的完整 CPU 特性。
虚拟机调优的本质,是把有限的物理资源按业务真实需求切开,再用少量关键参数把切开的缝隙补上,配置给对了,参数调准了,一台中等规格的宿主机也能稳稳跑住十几台业务虚拟机。