默认情况下,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-
阅读(802) | 评论(0) | 转发(1) |