分享

libvirt/qemu特性之numa

xioaxu790 发表于 2014-9-9 16:35:39 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 21975
本帖最后由 xioaxu790 于 2014-9-9 16:38 编辑
问题导读
1、如何查看主机node情况?

2、怎样设置guest numa topology?
3、VCPU如何绑定物理核?



Numa
查看主机node情况
使用virsh命令查看
  1. virsh # capabilities
  2. <topology>
  3.       <cells num='1'>
  4.         <cell id='0'>
  5.           <memory unit='KiB'>8166976</memory>
  6.           <cpus num='24'>
  7.             <cpu id='0' socket_id='0' core_id='0' siblings='0,12'/>
  8.             ...
  9.           </cpus>
  10.         </cell>
  11.       </cells>
  12.     </topology>
复制代码

使用numactl命令查看
  1. # numactl --hardware
复制代码


Guest Numa
设置guest numa topology
qemu内部安装ACPI规范将node信息,topology信息防止在bios中供guest识别。
guest识别numa topology的意义在于,guest中的OS可以更好的进行进程调度和内存分配。
libvirt
  1. <cpu>
  2.     <topology sockets='1' cores='8' threads='1'/>
  3.     <numa>
  4.       <cell cpus='0-3' memory='1024000'/>
  5.       <cell cpus='4-7' memory='1024000'/>
  6.      </numa>
  7.   </cpu>
复制代码


qemu
  1. -smp 8,sockets=1,cores=4,threads=1
  2. -numa node,nodeid=0,cpus=0-3,mem=1000 -numa node,nodeid=1,cpus=4-7,mem=1000
复制代码

可以在guest中使用numactl --hardware看到这些node节点。


CPU/内存亲和性设置
进程的处理器亲和性(Processor Affinity),即是CPU的绑定设置,是指将进程绑定到特定的一个或多个CPU上去执行,
而不允许调度到其他的CPU上。
在虚拟化环境中,qemu的vcpu是作为线程存在的,可以对线程进行亲和性设置。
多数情况下,我们无需设置亲和性。但是某些特殊场合,比如需要确保CPU资源不被其他虚拟机负载影响,
可以设置CPU的亲和性。
CPU亲和性由libvirt通过调用sched_setaffinity系统调用实现(如下以cpu热插中的代码为例),不需要在qemu层进行设置。
  1. src/qemu/qemu_driver.c:
  2. static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
  3.         |       |       |       | virDomainObjPtr vm,
  4.         |       |       |       | unsigned int nvcpus)
  5. {
  6.       ...
  7.       virProcessSetAffinity(cpupids[i],
  8.       ...
  9. }
  10. src/util/virprocess.c:
  11. int virProcessSetAffinity(pid_t pid, virBitmapPtr map)
  12. {
  13.       ...
  14.       if (sched_setaffinity(pid, masklen, mask) < 0) {
  15.       ...
  16. }
复制代码


memory的亲和性也是由libvirt通过调用numa_set_membind函数实现(由libnuma.so提供,该so为numactl的库)。
  1.   int
  2.   virNumaSetupMemoryPolicy(virNumaTuneDef numatune,
  3.           |       |       |virBitmapPtr nodemask)
  4.   {
  5.         ...
  6.         numa_set_membind(&mask);
  7.         ...
复制代码

备注:可以使用taskset工具手工对线程设置亲和性。


VCPU绑定物理核
  1. <vcpu cpuset='1-2'>4</vcpu>
复制代码

查看CPU绑定情况(其中28863为qemu的进程IP)
  1. #grep Cpus_allowed_list /proc/28863/task/*/status
  2. /proc/28863/task/28863/status:Cpus_allowed_list:    1-2
  3. /proc/28863/task/28864/status:Cpus_allowed_list:    1-2
  4. /proc/28863/task/28865/status:Cpus_allowed_list:    1-2
  5. /proc/28863/task/28866/status:Cpus_allowed_list:    1-2
  6. /proc/28863/task/28867/status:Cpus_allowed_list:    1-2
复制代码


cputune
cputune提供了精细的vcpu绑定设定,可以具体到每个vcpu设置。
而且提供vcpu能力的标准化,如quota,period,shares,可以用于实现cpu的Qos。
  1. <vcpu placement='static'>4</vcpu>
  2.   <cputune>
  3.     <shares>2048</shares>
  4.     <period>1000000</period>
  5.     <quota>-1</quota>
  6.     <vcpupin vcpu='0' cpuset='8'/>
  7.     <vcpupin vcpu='1' cpuset='16'/>
  8.     <emulatorpin cpuset='16'/>
  9.   </cputune>
复制代码


memtune
  1. <numatune>
  2. <memory mode="strict" nodeset="1"/>
  3. </numatune>
复制代码

查看内存的设定情况:(其中18104为qemu的pid)
  1. #grep Mems_allowed_list /proc/18104/task/*/status
  2. /proc/18104/task/18104/status:Mems_allowed_list:    1
  3. /proc/18104/task/18105/status:Mems_allowed_list:    1
  4. /proc/18104/task/18106/status:Mems_allowed_list:    1
  5. /proc/18104/task/18114/status:Mems_allowed_list:    1
复制代码


动态修改
numa
可以使用virsh numatune进行动态修改。
cpu affinity
可以使用virsh vcpupin进行修改。
设置emulator的cpu affinity
可以使用virsh emulatorpin进行修改。


Libvirt/qemu社区关于numa的最新动态
Add support for binding guest numa nodes to host numa nodes

社区review中。
提供了guest memory绑定策略的设置能力。
避免某些情况下由此导致的性能下降。 (比如PCI passthrough是设备DMA传输的情况?这点还是不太懂)
qemu配置方法范例:
  1. -object memory-ram,size=512M,host-nodes=1,policy=membind,id=ram-node0
  2. -numa node,nodeid=0,cpus=0,memdev=ram-node0
  3. -object memory-ram,size=1024M,host-nodes=2-3,policy=interleave,id=ram-node1
  4. -numa node,nodeid=1,cpus=1,memdev=ram-node1
复制代码


numa的一些缺点
如果配置不当,可能不但无法获取高性能,反而有可能导致性能恶化。
另外numa与透明页共享的冲突,即由于页合并导致的跨node访问。
vmware对此有专门优化,频繁访问的页面,在node上有页面副本,从而避免跨node访问带来的性能恶化。



本文转载自:http://blog.csdn.net/halcyonbaby/article/details/20152559



已有(1)人评论

跳转到指定楼层
linhai1023 发表于 2014-9-10 09:46:21
不懂,先留着
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条