在KVM虚拟化环境中,掌握宿主机CPU信息是进行性能调优的第一步。下面我们先了解基本概念。
1 宿主机CPU特性查看方法
使用 virsh nodeinfo 命令可以获取宿主机的基本CPU信息,例如CPU型号、核心数和线程数。虽然信息有限,但能帮助我们对硬件配置有个初步了解。
virsh nodeinfo
CPU model: x86_64
CPU(s): 32
CPU frequency: 1200 MHz
CPU socket(s): 1
Core(s) per socket: 8
Thread(s) per core: 2
NUMA cell(s): 2
Memory size: 132119080 KiB
若要获取更详尽的物理机CPU信息,包括物理CPU数量、每个CPU的核心数以及超线程是否启用,建议使用 virsh capabilities 命令。
virsh capabilities
36353332-3030-3643-5534-3235445a564a
x86_64
SandyBridge
Intel
...
...
...
|
...
|
...
查看宿主机的当前空闲内存,可以使用 virsh freecell 命令:
virsh freecell --all
0: 787288 KiB
1: 94192 KiB
--------------------
Total: 881480 KiB
此外,通过读取 /proc/cpuinfo 文件也能获取物理CPU的详细信息,例如:
cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz
...
physical id : 0
siblings : 16
core id : 0
cpu cores : 8
...
综合以上命令的输出,我们可以得出以下结论:
- 物理CPU为两颗Intel Xeon E5-2640 v2,每颗8核心,并启用了超线程技术,因此系统中总共识别出32个逻辑CPU;
- 宿主机物理内存容量为128GB。
2 虚拟机CPU使用情况查看与调度分析
使用 virsh vcpuinfo 命令可以查看虚拟机vCPU与物理CPU之间的映射关系。
virsh vcpuinfo 21
VCPU: 0
CPU: 25
State: running
CPU time: 10393.0s
CPU Affinity: --------yyyyyyyy--------yyyyyyyy
VCPU: 1
CPU: 8
State: running
CPU time: 7221.2s
CPU Affinity: --------yyyyyyyy--------yyyyyyyy
...
从输出可以看到,vcpu0当前被调度到物理CPU 25上,状态为运行中,累计CPU使用时间为10393.0秒。
CPU Affinity行中的yyyyyyy标记表示该虚拟机可用的物理CPU逻辑核心范围。从示例中可以看出,虚拟机的vCPU只能在8-15和24-31这些逻辑核心间调度。为何0-7和16-23不可用?这是系统自动NUMA平衡服务导致的——默认配置下,虚拟机仅能使用同一物理CPU内部的核心。
若要进一步确认虚拟机实际可用的物理逻辑CPU范围,可以使用 emulatorpin 命令:
virsh # emulatorpin 21
emulator: CPU Affinity
----------------------------------
*: 0-31
可以看到,该虚拟机允许使用0到31所有逻辑核心。这意味着我们可以通过配置强制将vCPU调度到任意一个物理CPU上。
3 在线绑定虚拟机CPU(CPU Pinning)
如果需要强制虚拟机仅能在26-31号逻辑核心上运行,可以执行以下命令:
virsh emulatorpin 21 26-31 --live
再次验证配置是否生效:
virsh emulatorpin 21
emulator: CPU Affinity
----------------------------------
*: 26-31
查看vcpuinfo信息:
virsh vcpuinfo 21
VCPU: 0
CPU: 28
State: running
CPU time: 10510.5s
CPU Affinity: --------------------------yyyyyy
VCPU: 1
CPU: 28
State: running
CPU time: 7289.7s
CPU Affinity: --------------------------yyyyyy
...
同时检查对应的虚拟机XML配置:
virsh # dumpxml 21
cacti-230
...
4
更进一步,我们可以实现vCPU与物理CPU的一一绑定。例如,将vcpu 0绑定到物理CPU 28,vcpu 1绑定到29,依次类推:
virsh vcpupin 21 0 28
virsh vcpupin 21 1 29
virsh vcpupin 21 2 30
virsh vcpupin 21 3 31
再次查看XML文件,确认配置已生效:
virsh # dumpxml 21
...
4
使用vcpuinfo命令进行验证:
virsh vcpuinfo 22
VCPU: 0
CPU: 28
State: running
CPU time: 1.8s
CPU Affinity: ----------------------------y---
VCPU: 1
CPU: 29
State: running
CPU time: 0.0s
CPU Affinity: -----------------------------y--
...
至此,CPU绑定配置已成功应用。
4 CPU Pinning简单性能测试
那么CPU Pinning究竟能带来多大的性能提升?我们通过一个简单的测试来验证。测试环境配置如下:
- 硬件平台:两颗Intel Xeon X5650 CPU,主频2.67GHz
- 宿主机操作系统:CentOS 7,内核版本3.10.0-123.8.1.el7.x86_64
- 虚拟机系统:同样使用CentOS 7及相同内核版本
- 虚拟机CPU配置:单核
- 性能测试工具:UnixBench 5.1.2
首先测试未进行CPU绑定的性能表现:
System Benchmarks Index Score 1444.7
然后测试进行CPU绑定后的性能:
System Benchmarks Index Score 1464.1
将两组结果直接对比:
- 综合评分:绑定后1464.1,未绑定1444.7,性能提升约1.34%
- 浮点运算性能:绑定后3928.7,未绑定3880.4,性能提升约1.24%
总结:CPU Pinning确实可以带来性能提升,但幅度有限,大约在1%左右。对于大多数应用场景而言,该收益并不显著。然而,在那些对CPU亲和性有极高要求的特殊场景下,实施CPU绑定仍然是一个值得考虑的性能优化手段。
