KVM是Linux平台主流的开源服务器虚拟化方案,裸金属之上直接承载虚拟机,配合QEMU提供完整虚拟化能力。服务器CPU虚拟化不只是装个虚拟机那么简单,vCPU分配、NUMA拓扑对齐、资源超卖控制直接决定业务性能。本文围绕KVM虚拟机资源分配与NUMA调优给出实战配置方案。
虚拟化前准备:CPU特性检查与嵌套虚拟化确认
部署KVM前先确认物理CPU支持硬件虚拟化扩展。Intel CPU需要VT-x(vmx标志),AMD CPU需要AMD-V(svm标志):
# 检查VT-x/AMD-V支持,输出大于0即支持
egrep -c '(vmx|svm)' /proc/cpuinfo
# 确认KVM模块已加载
lsmod | grep kvm
# 期望输出:kvm_intel 或 kvm_amd,以及 kvm 核心模块
# 需要在虚拟机内再跑虚拟化时,检查嵌套虚拟化
cat /sys/module/kvm_intel/parameters/nested
# Y为开启,N时编辑/etc/modprobe.d/kvm.conf加入:
# options kvm-intel nested=1
# 然后重新加载模块:modprobe -r kvm_intel && modprobe kvm_intel
检查通过后安装虚拟化栈:libvirt负责虚拟机生命周期管理,virt-install命令行建机,bridge-utils或iproute2提供网桥。
vCPU资源分配:绑定策略与超卖红线
vCPU本质是QEMU线程,由内核调度到物理核心。分配原则:单虚拟机vCPU数不超过物理核心的1/4用于常规负载,CPU密集型虚拟机vCPU不超过物理核数且独占绑核。两套典型配置:
<!-- 配置一:常规业务虚拟机,允许浮动调度 -->
<vcpu placement='static' current='4'>8</vcpu>
<cpu mode='host-passthrough' check='none'/>
<!-- placement=static固定vCPU上限,current热升级到8 -->
<!-- 配置二:低延迟生产虚拟机,CPU绑核+独占 -->
<vcpu placement='static'>8</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='2'/>
<vcpupin vcpu='1' cpuset='3'/>
<vcpupin vcpu='2' cpuset='4'/>
<vcpupin vcpu='3' cpuset='5'/>
<vcpupin vcpu='4' cpuset='6'/>
<vcpupin vcpu='5' cpuset='7'/>
<vcpupin vcpu='6' cpuset='8'/>
<vcpupin vcpu='7' cpuset='9'/>
<emulatorpin cpuset='0-1'/>
</cputune>
<cpu mode='host-passthrough'>
<topology sockets='1' cores='4' threads='2'/>
</cpu>
emulatorpin把QEMU设备模拟线程固定到独立核心,避免I/O线程抢占业务vCPU,低延迟场景必配。超卖比例上,纯Web类负载CPU超卖可达3:1,数据库与计算类虚拟机不建议超卖,超卖叠加NUMA跨节点访问会把性能放大劣化。
NUMA拓扑对齐:消除跨节点内存访问的性能陷阱
多路服务器上CPU与内存按NUMA节点划分,虚拟机内存落在远端节点时访问延迟上升约50%。先看物理拓扑:
# 查看NUMA节点与CPU分布
numactl --hardware
# 示例输出(双路服务器):
# available: 2 nodes (0-1)
# node 0 cpus: 0 1 2 3 4 5 6 7
# node 1 cpus: 8 9 10 11 12 13 14 15
# 查看各节点内存余量
numactl --show | grep -i membind
让虚拟机整体落在单一NUMA节点,libvirt层面用vcpupin加memnode绑定:
<cpu mode='host-passthrough'>
<numa>
<cell id='0' cpus='0-7' memory='16106127360' unit='KiB'/>
</numa>
</cpu>
<memoryBacking>
<hugepages/>
<nosharepages/>
</memoryBacking>
搭配大页内存(hugepages),虚拟机内存占用2MB页而非4KB页,TLB命中率显著提升,数据库虚拟机实测可提升5%-12%的吞吐。宿主机需预先预留大页:
# 预留8GB大页(每页2MB,共4096页)
sysctl -w vm.nr_hugepages=4096
# 写入/etc/sysctl.conf持久化,并挂载hugetlbfs
mount -t hugetlbfs none /dev/hugepages
大页内存一旦预留即从普通内存池扣除,规划时给宿主机操作系统留足20%普通内存,防止预留过度触发OOM。
资源监控与热点排查命令
虚拟机运行后的性能验证依赖宿主机侧观测,比虚拟机内监控更接近真相:
# 实时查看vCPU线程在物理核上的分布与占用
virt-top
# 或 top -H -p $(pidof qemu-kvm) 精确到QEMU线程
# 检查虚拟机内存是否跨NUMA节点(关键指标)
numastat -p $(pidof qemu-kvm) | awk 'NR<=2 || /node0|node1/'
# Node1列不为零说明内存跨节点分布,需要memnode重绑
# 虚拟机内部验证CPU直通效果
grep -o 'vmx\|svm' /proc/cpuinfo | head -1
跨节点内存占比超过10%就该重新规划虚拟机布局。长期运维中把NUMA节点当作资源池边界来分配虚拟机,比按CPU核数切分更合理,一个NUMA节点塞一个重载虚拟机是双路服务器最稳的布局方式。
KVM虚拟化调优的核心逻辑是让虚拟机的CPU、内存拓扑与物理硬件结构对齐。绑核、NUMA绑定、大页三项配置组合落地后,数据库与计算型负载的性能差距能到15%以上,配置成本却只是几段XML。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/fu-wu-qi-cpu-xu-ni-hua-shi-zhan-kvm-xu-ni-ji-zi-yuan-fen/