参考:
默认情况下,libvirt为guests提供默认的策略。对于大多数的虚拟机管理程序,默认策略是guests运行在任何可用的处理器core或cpu。对于NUMA(Non-Uniform Memory Access,非一致性内存访问),有一个明确的使用cpu的策略会更好。
关于NUMA:
NUMA模式是一种分布式存储器访问方式,处理器可以同时访问不同的存储器地址(内存),大幅度提高并行性。 NUMA模式下,处理器被划分成多个"节点"(node), 每个节点被分配有的本地存储器空间。 所有节点中的处理器都可以访问全部的系统物理存储器,但是访问本节点内的存储器所需要的时间,比访问某些远程节点内的存储器所花的时间要少得多。
一个guest应该使用一个固定的处理器内核,这样,guest所使用的内存也固定在所运行的node上。这样可以避免跨节点的内存拷贝造成性能下降。
1、确定CPU和NUMA拓扑
virsh nodeinfo 命令提供有关host上sockets,cores和hyperthreads的信息。
- # virsh nodeinfo
- CPU model: x86_64
- CPU(s): 8
- CPU frequency: 2394 MHz
- CPU socket(s): 1
- Core(s) per socket: 4
- Thread(s) per core: 1
- NUMA cell(s): 2
- Memory size: 8242076 kB
This system has eight CPUs in one socket.
上面的输出显示出系统是一个NUMA的架构。
使用 virsh capabilities 获取更多cpu的信息。
- [root@srv ~]# virsh capabilities
-
<capabilities>
-
-
<host>
-
<uuid>b7fe937d-3644-ec7c-feff-d196936a35b1</uuid>
-
<cpu>
-
<arch>x86_64</arch>
-
<model>phenom</model>
-
<topology sockets='1' cores='4' threads='1'/>
-
<feature name='wdt'/>
-
<feature name='skinit'/>
-
<feature name='osvw'/>
-
<feature name='3dnowprefetch'/>
-
<feature name='misalignsse'/>
-
<feature name='sse4a'/>
-
<feature name='abm'/>
-
<feature name='cr8legacy'/>
-
<feature name='extapic'/>
-
<feature name='cmp_legacy'/>
-
<feature name='lahf_lm'/>
-
<feature name='rdtscp'/>
-
<feature name='pdpe1gb'/>
-
<feature name='popcnt'/>
-
<feature name='cx16'/>
-
<feature name='ht'/>
-
<feature name='vme'/>
-
</cpu>
-
<migration_features>
-
<live/>
-
<uri_transports>
-
<uri_transport>tcp</uri_transport>
-
</uri_transports>
-
</migration_features>
-
<topology>
-
<cells num='2'>
-
<cell id='0'>
-
<cpus num='4'>
-
<cpu id='0'/>
-
<cpu id='2'/>
-
<cpu id='4'/>
-
<cpu id='6'/>
-
</cpus>
-
</cell>
-
<cell id='1'>
-
<cpus num='4'>
-
<cpu id='1'/>
-
<cpu id='3'/>
-
<cpu id='5'/>
-
<cpu id='7'/>
-
</cpus>
-
</cell>
-
</cells>
-
</topology>
-
<secmodel>
-
<model>selinux</model>
-
<doi>0</doi>
-
</secmodel>
-
</host>
-
-
[ Additional XML removed ]
-
-
</capabilities>
上面的输出显示有两个NUMA nodes(也叫做NUMA cells),每个node包含4个逻辑cpu(4 processing cores)。对于一个分配4个cpu的guest,最佳的选择是为guest锁定cpu为0,2,4,6或1,3,5,7以避免访问非本地内存的情况。
2、确定使用哪个NUMA node来运行guest
将guest锁定在一个不能为guest提供足够内存的NUMA node上不能获得好处。使用virsh freecell显示所有NUMA nodes的空闲内存# virsh freecell
0: 2203620 kB
1: 3354784 kB如果一个guest需要分配3GB的内存。guest应该运行在NUMA node1,node0只有2.2GB的空闲内存,不能为guset提供足够的内存。
3、将guset锁定在一个NUMA node或物理CPU集合。
通过virsh capabilities的输出确定使用哪个cell。
修改guest的xml文件:
4
或
4
注:libvirt 0.9.0后的写法
- <cputune>
-
<vcpupin vcpu="0" cpuset="1-4,^2"/>
-
<vcpupin vcpu="1" cpuset="0,1"/>
-
<vcpupin vcpu="2" cpuset="2,3"/>
-
<vcpupin vcpu="3" cpuset="0,4"/>
-
<shares>2048</shares>
-
<period>1000000</period>
-
<quota>-1</quota>
-
</cputune
4、使用virt-install自动锁定guset使用的cpu。
virt-insstall提供一个简单的方法,用于在创建guest时自动提供一个最合适的NUMA策略。
对于NUMA系统,使用--cpuset=auto参数和virt-install命令创建新的guest。
5、使用virsh vcpuinfo 和 virsh vcpupin调整运行中guest的CPU affinity
- [root@srv ~]# virsh vcpuinfo vm1
-
VCPU: 0
-
CPU: 4
-
State: running
-
CPU time: 10306.2s
-
CPU Affinity: yyyyyyyy
-
-
VCPU: 1
-
CPU: 6
-
State: running
-
CPU time: 34546.2s
-
CPU Affinity: yyyyyyyy
-
-
VCPU: 2
-
CPU: 2
-
State: running
-
CPU time: 13293.5s
-
CPU Affinity: yyyyyyyy
-
-
VCPU: 3
-
CPU: 6
-
State: running
-
CPU time: 27101.6s
-
CPU Affinity: yyyyyyyy
其中yyyyyyyy,每个y对已一个cpu core,上面的输出意为着,每个vcpu可以在8个物理cpu中的任意一个上面来运行,即不固定。
使用vcpupin来锁定vcpu运行在一个NUMA node上。
- [root@srv ~]# virsh vcpupin vm1 0 0
-
-
[root@srv ~]# virsh vcpupin vm1 1 2
-
-
[root@srv ~]# virsh vcpupin vm1 2 4
-
-
[root@srv ~]# virsh vcpupin vm1 3 6
验证:
- [root@srv ~]# virsh vcpuinfo vm_openxlog
-
VCPU: 0
-
CPU: 0
-
State: running
-
CPU time: 10322.2s
-
CPU Affinity: y-------
-
-
VCPU: 1
-
CPU: 2
-
State: running
-
CPU time: 34579.4s
-
CPU Affinity: --y-----
-
-
VCPU: 2
-
CPU: 4
-
State: running
-
CPU time: 13302.2s
-
CPU Affinity: ----y---
-
-
VCPU: 3
-
CPU: 6
-
State: running
-
CPU time: 27116.6s
-
CPU Affinity: ------y-
另外,也可以将一个vcpu固定在2个或2个以上的cpu core上
- [root@srv ~]# virsh vcpupin vm1 0 0,2
- [root@srv ~]# virsh vcpupin vm1 1 2,4
- [root@srv ~]# virsh vcpupin vm1 2 4,6
- [root@srv ~]# virsh vcpupin vm1 3 6,0
验证:
- [root@srv ~]# virsh vcpuinfo vm1
-
VCPU: 0
-
CPU: 2
-
State: running
-
CPU time: 10523.7s
-
CPU Affinity: y-y-----
-
-
VCPU: 1
-
CPU: 4
-
State: running
-
CPU time: 35336.8s
-
CPU Affinity: --y-y---
-
-
VCPU: 2
-
CPU: 6
-
State: running
-
CPU time: 13450.3s
-
CPU Affinity: ----y-y-
-
-
VCPU: 3
-
CPU: 0
-
State: running
-
CPU time: 27370.5s
-
CPU Affinity: y-----y-
阅读(3517) | 评论(0) | 转发(0) |