kvm虚拟化小结(十三)KVM cpu pinning
本文包含以下内容:
- 宿主机CPU特性查看
- 虚拟机CPU特性查看
- KVM虚拟机cpu pinning如何配置
- cpu pinning的应用场景
首先需求了解基本的信息
1 宿主机CPU特性查看
使用virsh nodeinfo可以看到一些基本信息
1# virsh nodeinfo
2CPU model: x86_64
3CPU(s): 32
4CPU frequency: 1200 MHz
5CPU socket(s): 1
6Core(s) per socket: 8
7Thread(s) per core: 2
8NUMA cell(s): 2
9Memory size: 132119080 KiB
使用virsh capabilities可以查看物理机CPU的详细信息,包括物理CPU个数,每个CPU的核数,是否开了超线程。
1# virsh capabilities
2<capabilities>
3 <host>
4 <uuid>36353332-3030-3643-5534-3235445a564a</uuid>
5 <cpu>
6 <arch>x86_64</arch>
7 <model>SandyBridge</model>
8 <vendor>Intel</vendor>
9 <topology sockets='1' cores='8' threads='2'/>
10 <feature name='erms'/>
11 <feature name='smep'/>
12 ...
13 </cpu>
14 <power_management>
15 <suspend_disk/>
16 </power_management>
17 <migration_features>
18 <live/>
19 <uri_transports>
20 <uri_transport>tcp</uri_transport>
21 </uri_transports>
22 </migration_features>
23 <topology>
24 <cells num='2'>
25 <cell id='0'>
26 <cpus num='16'>
27 <cpu id='0' socket_id='0' core_id='0' siblings='0,16'/>
28 ...
29 <cpu id='23' socket_id='0' core_id='7' siblings='7,23'/>
30 </cpus>
31 </cell>
32 <cell id='1'>
33 <cpus num='16'>
34 <cpu id='8' socket_id='1' core_id='0' siblings='8,24'/>
35 ...
36 <cpu id='31' socket_id='1' core_id='7' siblings='15,31'/>
37 </cpus>
38 </cell>
39 </cells>
40 </topology>
41 <secmodel>
42 <model>none</model>
43 <doi>0</doi>
44 </secmodel>
45 <secmodel>
46 <model>dac</model>
47 <doi>0</doi>
48 </secmodel>
49 </host>
50...
51</capabilities>
使用virsh freecell命令查看可以当前空闲内存:
1# virsh freecell --all
2 0: 787288 KiB
3 1: 94192 KiB
4--------------------
5Total: 881480 KiB
此处有暂时没搞清为什么是两个值--莫非后面一个是swap的?以下是我台机上看到的情况,只有一个值:
1[root@361way ~]# virsh freecell --all
2 0: 13283648 KiB
3--------------------
4Total: 13283648 KiB
物理CPU的特性也可以通过/proc/cpuinfo查看
1# cat /proc/cpuinfo
2rocessor : 0
3vendor_id : GenuineIntel
4cpu family : 6
5model : 62
6model name : Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz
7stepping : 4
8cpu MHz : 1200.000
9cache size : 20480 KB
10physical id : 0
11siblings : 16
12core id : 0
13cpu cores : 8
14apicid : 0
15initial apicid : 0
16fpu : yes
17fpu_exception : yes
18cpuid level : 13
19wp : yes
20flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms
21bogomips : 3990.67
22clflush size : 64
23cache_alignment : 64
24address sizes : 46 bits physical, 48 bits virtual
25power management:
26...
综合上面的信息,我们可以得出以下信息:
1) 物理CPU为 E5-2640V2,为8核2颗,开启了超线程,在物理机系统上可以看到32个CPU;
2) 物理机内存为128G
2 虚拟机CPU使用情况查看
可以使用virsh vcpuinfo命令查看虚拟机vcpu和物理CPU的对应关系
1# virsh vcpuinfo 21
2VCPU: 0
3CPU: 25
4State: running
5CPU time: 10393.0s
6CPU Affinity: --------yyyyyyyy--------yyyyyyyy
7VCPU: 1
8CPU: 8
9State: running
10CPU time: 7221.2s
11CPU Affinity: --------yyyyyyyy--------yyyyyyyy
12...
可以看到vcpu0被调度到物理机CPU25上,目前是使用状态,使用时间是10393.0s
CPU Affinity: ——–yyyyyyyy——–yyyyyyyy
yyyyyyy表示可以使用的物理CPU内部的逻辑核,可以看到这台虚拟机可以在8-15,24-31这些cpu之间调度,为什么不能使用0-7,16-23这些CPU呢,是因为系统的自动numa平衡服务在发生作用,一个虚拟机默认只能使用同
一颗物理CPU内部的逻辑核。
需要注意的是,上面的21是虚拟机的名称
,如下是我在家里的测试机上的结果:
1[root@361way ~]# virsh list
2 Id Name State
3----------------------------------------------------
4 2 rserver running
5 3 rhce running
6 4 centos running
7[root@361way ~]# virsh vcpuinfo rserver
8VCPU: 0
9CPU: 1
10State: running
11CPU time: 10.5s
12CPU Affinity: yyyyyyyy
13VCPU: 1
14CPU: 0
15State: running
16CPU time: 5.3s
17CPU Affinity: yyyyyyyy
使用emulatorpin可以查看虚拟机可以使用那些物理逻辑CPU
1# virsh emulatorpin 21
2emulator: CPU Affinity
3----------------------------------
4 *: 0-31
可以看到0-31我们都可以使用,意味这我们也可以强制将CPU调度到任何CPU上。
3 在线pinning虚拟机的cpu
强制让虚拟机只能在26-31这些cpu之间调度
1# virsh emulatorpin 21 26-31 --live
查看结果
1# virsh emulatorpin 21
2emulator: CPU Affinity
3----------------------------------
4 *: 26-31
查看vcpu info
1# virsh vcpuinfo 21
2VCPU: 0
3CPU: 28
4State: running
5CPU time: 10510.5s
6CPU Affinity: --------------------------yyyyyy
7VCPU: 1
8CPU: 28
9State: running
10CPU time: 7289.7s
11CPU Affinity: --------------------------yyyyyy
12...
查看xml文件
1virsh # dumpxml 21
2<domain type='kvm' id='21'>
3 <name>cacti-230</name>
4 <uuid>23a6455c-5cd1-20cd-ecfe-2ba89be72c41</uuid>
5 <memory unit='KiB'>4194304</memory>
6 <currentMemory unit='KiB'>4194304</currentMemory>
7 <vcpu placement='static'>4</vcpu>
8 <cputune>
9 <emulatorpin cpuset='26-31'/>
10 </cputune>
我们也可以强制vcpu和物理机cpu一对一的绑定
- 强制vcpu 0和物理机cpu 28绑定
- 强制vcpu 1和物理机cpu 29绑定
- 强制vcpu 2和物理机cpu 30绑定
- 强制vcpu 3和物理机cpu 31绑定
1virsh vcpupin 21 0 28
2virsh vcpupin 21 1 29
3virsh vcpupin 21 2 30
4virsh vcpupin 21 3 31
查看xml文件,生效了
1virsh # dumpxml 21
2<domain type='kvm' id='21'>
3 <name>cacti-230</name>
4 <uuid>23a6455c-5cd1-20cd-ecfe-2ba89be72c41</uuid>
5 <memory unit='KiB'>4194304</memory>
6 <currentMemory unit='KiB'>4194304</currentMemory>
7 <vcpu placement='static'>4</vcpu>
8 <cputune>
9 <vcpupin vcpu='0' cpuset='28'/>
10 <vcpupin vcpu='1' cpuset='29'/>
11 <vcpupin vcpu='2' cpuset='30'/>
12 <vcpupin vcpu='3' cpuset='31'/>
13 <emulatorpin cpuset='26-31'/>
14 </cputune>
是vcpuino命令查看,可以看到配置生效了
1# virsh vcpuinfo 22
2VCPU: 0
3CPU: 28
4State: running
5CPU time: 1.8s
6CPU Affinity: ----------------------------y---
7VCPU: 1
8CPU: 29
9State: running
10CPU time: 0.0s
11CPU Affinity: -----------------------------y--
12...
4 CPU pinning技术应用场景
pinning前后效果比较
没有做cpu pinning
前面的cpu压力和后面的cpu压力相差很大
做了cpu pinning
前后CPU性能比较平衡了,cpupin实际libvirt也是通过cgroup来实现的,通过cgroup直接去限制kvm虚拟机进程也可以,以后分享给大家。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/kvm-cpu-pinning/4755.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.