libvirt/qemu特性之numa

声明:

本博客欢迎转发,但请保留原作者信息!

博客地址:http://blog.csdn.net/halcyonbaby

内容系本人学习、研究和总结,如有雷同,实属荣幸!

Numa

查看主机node情况

  • 使用virsh命令查看
virsh # capabilities
<topology>
      <cells num='1'>
        <cell id='0'>
          <memory unit='KiB'>8166976</memory>
          <cpus num='24'>
            <cpu id='0' socket_id='0' core_id='0' siblings='0,12'/>
            ...
          </cpus>
        </cell>
      </cells>
    </topology>
  • 使用numactl命令查看
# numactl --hardware

Guest Numa

设置guest numa topology

qemu内部安装ACPI规范将node信息,topology信息防止在bios中供guest识别。
guest识别numa topology的意义在于,guest中的OS可以更好的进行进程调度和内存分配。

  • libvirt
<cpu>
    <topology sockets='1' cores='8' threads='1'/>
    <numa>
      <cell cpus='0-3' memory='1024000'/>
      <cell cpus='4-7' memory='1024000'/>
     </numa>
  </cpu>
  • qemu
-smp 8,sockets=1,cores=4,threads=1
-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层进行设置。

src/qemu/qemu_driver.c
static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
        ¦       ¦       ¦       ¦ virDomainObjPtr vm,
        ¦       ¦       ¦       ¦ unsigned int nvcpus)
{
      ...
      virProcessSetAffinity(cpupids[i],
      ...
}
src/util/virprocess.c
int virProcessSetAffinity(pid_t pid, virBitmapPtr map)
{
      ...
      if (sched_setaffinity(pid, masklen, mask) < 0) {
      ...
}

memory的亲和性也是由libvirt通过调用numa_set_membind函数实现(由libnuma.so提供,该so为numactl的库)。

  int
  virNumaSetupMemoryPolicy(virNumaTuneDef numatune,
          ¦       ¦       ¦virBitmapPtr nodemask)
  {
        ...
        numa_set_membind(&mask);
        ...

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

VCPU绑定物理核

<vcpu cpuset='1-2'>4</vcpu>

查看CPU绑定情况(其中28863为qemu的进程IP)

#grep Cpus_allowed_list /proc/28863/task/*/status 
/proc/28863/task/28863/status:Cpus_allowed_list:    1-2
/proc/28863/task/28864/status:Cpus_allowed_list:    1-2
/proc/28863/task/28865/status:Cpus_allowed_list:    1-2
/proc/28863/task/28866/status:Cpus_allowed_list:    1-2
/proc/28863/task/28867/status:Cpus_allowed_list:    1-2

cputune

cputune提供了精细的vcpu绑定设定,可以具体到每个vcpu设置。
而且提供vcpu能力的标准化,如quota,period,shares,可以用于实现cpu的Qos。

 <vcpu placement='static'>4</vcpu>
  <cputune>
    <shares>2048</shares>
    <period>1000000</period>
    <quota>-1</quota>
    <vcpupin vcpu='0' cpuset='8'/>
    <vcpupin vcpu='1' cpuset='16'/>
    <emulatorpin cpuset='16'/>
  </cputune>

memtune

<numatune>
    <memory mode="strict" nodeset="1"/>
  </numatune>

查看内存的设定情况:(其中18104为qemu的pid)

#grep Mems_allowed_list /proc/18104/task/*/status
/proc/18104/task/18104/status:Mems_allowed_list:    1
/proc/18104/task/18105/status:Mems_allowed_list:    1
/proc/18104/task/18106/status:Mems_allowed_list:    1
/proc/18104/task/18114/status:Mems_allowed_list:    1

动态修改

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

Libvirt/qemu社区关于numa的最新动态

-object memory-ram,size=512M,host-nodes=1,policy=membind,id=ram-node0 
-numa node,nodeid=0,cpus=0,memdev=ram-node0 
-object memory-ram,size=1024M,host-nodes=2-3,policy=interleave,id=ram-node1 
-numa node,nodeid=1,cpus=1,memdev=ram-node1 

numa的一些缺点

如果配置不当,可能不但无法获取高性能,反而有可能导致性能恶化。

另外numa与透明页共享的冲突,即由于页合并导致的跨node访问。
vmware对此有专门优化,频繁访问的页面,在node上有页面副本,从而避免跨node访问带来的性能恶化。


更多相关文章
  • 易网科技讯 3月16日消息,浙江广电网络省网整合取得新进展.易网科技从浙江华数公司获悉,衢州市本级所属县市区已于近日以全资形式统一加入浙江华数广电网络股份有限公司,成为浙江"一省一网"整合发展的关键一步.据了解,此次签约之后,浙江华数广电网络股份有限公司将以超高速跨代网为网络基础 ...
  • 编者按,下文为红杉资本中国基金的创始及执行合伙人沈南鹏,在清科集团举办的"第十四届中国股权投资年度论坛"上的演讲.今年我发现是一个非常有意思的现象,两个极端:一方面从年中开始听到很多投资界人士提醒大家,是不是冬天马上要来了,要做好最坏的准备:另一方面创投市场异常活跃,今年不管VC ...
  • 信息化技术的高速发展,为每个时代烙下了不同的印记.如今,我们正处于云计算和大数据时代,云计算以其灵活的计算能力和平台开放能力,为大数据的快速发展打下了良好基础,并已先行落地;而大数据作为云计算应用的升华,正在展现着数据的价值与魅力,并为各行各业的业务创新不断提速. 大数据来势汹汹,传统行业面临着重构 ...
  • 最近在一次项目中使用到了C#中命名管道,所以在此写下一篇小结备忘.   为什么要使用命名管道呢?为了实现两个程序之间的数据交换.假设下面一个场景.在同一台PC上,程序A与程序B需要进行数据通信,此时我们就可以使用命名管道技术来实现.命名管道的两个对象.NamedPipeClientStream 和 ...
  • 一.使用指针传出分解后的数字 实现一个方法“多个返回值”的效果:返回一个三位数数字的个位.十位.百位.这里,我们借助指针来”返回“分解后的结果.这种应用也是最常见的指针应用. // fun1:分解一个三位数,传递个位.十位和百位数字 int parseNumber(int num,int* g,in ...
  • 如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥>承蒙大家喜爱和编辑推荐,在此非常感谢大家支持.在中我发现很多朋友还在使用老的IDE, ...
一周排行
  • 前言 今天是个开心的日子,又是周末,可以轻轻松松的写写文章了.去年,我写了ENode 1.0版本,那时我也写了一个分析系列.经过了大半年的时间,我对第一个版本做了很多架构上的改进,最重要的就是让ENode实现了分布式 ...
  • 增加swap分区: [[email protected] ~]# free -m total used free shared buffers cached Mem: 1562 1515 46 0 9 1420 -/+ buffe ...
  • 本文 PDF版本可到如下两个地址下载: CSDN下载地址:http://download.csdn.net/source/3575067 百度文库下载地址:http://wenku.baidu.com/view/44 ...
  • Style绑定可以通过ViewModel绑定到DOM元素CSS风格属性,例如:1<span data-bind="style: {color: priceColor, fontWeight: pric ...
  • 习惯了每次在xp下把U盘的自动播放给关闭,但是在Win7下一直没有找到相关项(主要原因是英文水平次,).今天认真看了下win7下的组策略,突然发现微软把它加强了许多,这可能会是一个趋势,把设置集中到组策略,减少对注册 ...
  • 写入位置时发生访问冲突 原因总结: 1:使用了未初始化的指针(未给指针分配空间) 2:使用了已经删除的指针 3.char str[]="ABCD",这个数组的存储空间是在栈中开辟的(在栈中开辟了一 ...
  • 我记得小时候要写数学作业时,如果遇到那种大家都解不出来的问题时,通常会有一个高手会先把解法解出来,剩下的人再依样画葫芦,照着抄一遍.只要高手没有写错,不会是每个人都错同样的地方,老师通常不会发现.只是有些时候,有些人 ...
  • 前段时间有媒体报道了一件趣事:有人通过Siri语音询问iPhone哪款智能手机最好,而Siri的回答竟然是Lumia 900,而不是自家的iPhone.现在却轮到Lumia"玩暧昧",把iPhon ...
  • 比如说c中有 int safe(int argc,char* argv[]){}char* argv[] 这个指针数组 怎么传到jni中?如果 写成这样 public class Safe { public nati ...
  • 易网科技讯 4月3日消息,据国外媒体报道,美国运营商Verizon通信周二否认了有关公司将与AT&T合作,共同收购沃达丰集团的报道.沃达丰拥有Verizon旗下无线业务45%的股份.Verizon通信拥有Ve ...