虚拟机铆钉CPU
把虚拟机的vCPU绑定在物理CPU上,即VCPU只在绑定的物理CPU上调度,在特定场景下达到提升虚拟机性能的目的。比如在NUMAQ系统中,把vCPU绑定在同一个NUMA节点上,可以避免CPU跨节点访问内存,避免影响虚拟机运行性能。
如果未绑定,默认vCPU可在任何物理CPU上调度。具体的绑定策略由系统来决定。
系统CPU情况
本机的CPU情况,部分截取如下,共有15和core:
[root@localhost ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 46 bits physical, 57 bits virtual
Byte Order: Little Endian
CPU(s): 20
On-line CPU(s) list: 0-15
Vendor ID: GenuineIntel
Model name: Intel(R) Xeon(R) D-1744NTE CPU @ 2.30GHz
CPU family: 6
Model: 108
Thread(s) per core: 2
Core(s) per socket: 10
Socket(s): 1
Stepping: 1
CPU max MHz: 3000.0000
CPU min MHz: 500.0000
BogoMIPS: 3000.00
Virtualization features:
Virtualization: VT-x
Caches (sum of all):
L1d: 480 KiB (10 instances)
L1i: 320 KiB (10 instances)
L2: 12.5 MiB (10 instances)
L3: 15 MiB (1 instance)
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
异常样例
注意:可以先查看某一虚拟机CPU使用情况,使用virsh vcpuinfo+虚拟机ID,这里的虛拟机,必须是正在运行的虚拟机。每次重启虚拟机,虚拟机ID也会同步发生改变。
[root@localhost ~]# virsh list
Id Name State
----------------------
5 LMT running
8 TES running
14 BRO running
#下面的 5 表示本次为 LMT 分配的虚机ID
[root@localhost ~]# virsh vcpuinfo 5
VCPU: 0
CPU: 24
State: running
CPU time: 54791.1s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 1
CPU: 0
State: running
CPU time: 54738.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 2
CPU: 24
State: running
CPU time: 54769.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 3
CPU: 0
State: running
CPU time: 54764.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
#查看TES虚拟机的CPU 使用情况
[root@localhost ~]# virsh vcpuinfo 8
VCPU: 0
CPU: 24
State: running
CPU time: 6883.3s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 1
CPU: 24
State: running
CPU time: 6743.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
#查看BRO虚拟机的CPU 使用情况
[root@5GC ~]# virsh vcpuinfo 14
VCPU: 0
CPU: 0
State: running
CPU time: 3200.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 1
CPU: 0
State: running
CPU time: 3256.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 2
CPU: 0
State: running
CPU time: 3254.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 3
CPU: 24
State: running
CPU time: 3246.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 4
CPU: 0
State: running
CPU time: 3250.2s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 5
CPU: 24
State: running
CPU time: 3234.4s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 6
CPU: 0
State: running
CPU time: 3212.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 7
CPU: 0
State: running
CPU time: 3241.4s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 8
CPU: 0
State: running
CPU time: 3211.0s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 9
CPU: 0
State: running
CPU time: 3218.6s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
从上面可以看到 3 虚机,共计需要: 4 + 2 + 10 == 16
个,但是有 9 个使用的都是物理核0。导致 BRO虚拟机(尽管预分配14个core)运行很慢!
具体配置方式
打开对应的配置文件,默认路径是:/etc/libvirt/qemu/
vim /etc/libvirt/qemu/BRO.xml
<vcpu placement='static'>3</vcpu>
<vcpu vcpuset='13,15' >3</vcpu><!--这里原来的内容有placement='static' 我们把它去掉,添加上vcpuset='13,15'表示将该虚拟机的vcpu钉选到物理CPU为[13-15]上面-->
<cputune>
<vcpupin vcpu='0' cpuset='13'/><!--将vCPU 0钉选到物理CPU 13上面-->
<vcpupin vcpu='1' cpuset='14'/><!--将vCPU 1钉选到物理CPU 14上面-->
<vcpupin vcpu='2' cpuset='15'/><!--将vCPU 2钉选到物理CPU 15上面-->
</cputune>
请一定注意:<vcpu vcpuset='13,15' >3</vcpu>
这一行中的数字3
表示,虚拟机占用3个CPU 核,需要和下面的 <cputune>
具体行数对应起来,否则一旦加载虚拟机,则会重启恢复到之前的CPU的铆钉配置。
此外,vcpupin 从 0
开始编号。
更新配置文件生效
修改完xml文件后,使用下面更新命令:
virsh define /etc/libvirt/qemu/BRO.xml
建议配置完成后,重启虚拟机 BRO
Reference
KVM VCPU Requests
CPU Pinning understanding
How to Perform CPU Pinning for KVM Virtual Machines and Docker Containers