KVM调整虚拟机与CPU铆钉(绑定)关系
虚拟机铆钉CPU
把虚拟机的vCPU绑定在物理CPU上,即VCPU只在绑定的物理CPU上调度,在特定场景下达到提升虚拟机性能的目的。比如在NUMAQ系统中,把vCPU绑定在同一个NUMA节点上,可以避免CPU跨节点访问内存,避免影响虚拟机运行性能。
如果未绑定,默认vCPU可在任何物理CPU上调度。具体的绑定策略由系统来决定。
系统CPU情况
本机的CPU情况,部分截取如下,共有15和core:
[root@localhost ~]# lscpu
Architecture: x86_64CPU op-mode(s): 32-bit, 64-bitAddress sizes: 46 bits physical, 57 bits virtualByte Order: Little Endian
CPU(s): 20On-line CPU(s) list: 0-15
Vendor ID: GenuineIntelModel name: Intel(R) Xeon(R) D-1744NTE CPU @ 2.30GHzCPU family: 6Model: 108Thread(s) per core: 2Core(s) per socket: 10Socket(s): 1Stepping: 1CPU max MHz: 3000.0000CPU min MHz: 500.0000BogoMIPS: 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): 1NUMA node0 CPU(s): 0-15
异常样例
注意:可以先查看某一虚拟机CPU使用情况,使用virsh vcpuinfo+虚拟机ID,这里的虛拟机,必须是正在运行的虚拟机。每次重启虚拟机,虚拟机ID也会同步发生改变。
[root@localhost ~]# virsh listId Name State
----------------------5 LMT running8 TES running14 BRO running#下面的 5 表示本次为 LMT 分配的虚机ID
[root@localhost ~]# virsh vcpuinfo 5
VCPU: 0
CPU: 24
State: running
CPU time: 54791.1s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 1
CPU: 0
State: running
CPU time: 54738.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 2
CPU: 24
State: running
CPU time: 54769.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 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: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 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: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 1
CPU: 0
State: running
CPU time: 3256.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 2
CPU: 0
State: running
CPU time: 3254.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 3
CPU: 24
State: running
CPU time: 3246.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 4
CPU: 0
State: running
CPU time: 3250.2s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 5
CPU: 24
State: running
CPU time: 3234.4s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 6
CPU: 0
State: running
CPU time: 3212.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 7
CPU: 0
State: running
CPU time: 3241.4s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 8
CPU: 0
State: running
CPU time: 3211.0s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyVCPU: 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