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, ...
一周排行
  • 1.走秀网的团购网站 秀团,由于应用设计缺陷,可以造成任意密码修改 2.存储型XSS 一. 可短时间内修改大量(批量)用户密码 1.进入秀团登陆处,点忘记密码,选择邮箱重设       2.进入邮箱,打开修改密码的链 ...
  • REDHAT 中YUM源文件在以下目录内/etc/yum.repos.d/其文件夹内的 .repo文件即为YUM源文件,其用于解释软件库位置及通过的REDHAT校检等信息.配置如下:[Server]-YUM分段说明n ...
  • 飞象网讯(吉利/文)根据公告,2011年6月,中国移动湖北本地结算的SP涉及自消费的共11家,涉及金额达74万元,中国移动集团一点结算涉及湖北用户的SP共3家,涉及金额为28万元.其中,腾讯搜狐等9家SP因自消费遭暂 ...
  • sql 在使用中每次查询都会生成日志,但是如果你长久不去清理,可能整个硬都堆满哦,笔者就遇到这样的情况,直接网站后台都进不去了.下面我们一起来学习一下如何清理这个日志吧     SQL2005清空删除日志:   代码 ...
  • 同事到客户那里去演示系统,笔记本上安装了Tomcat(v6.0.18)+Oracle9i,到客户处发现Tomcat无法连接到数据库!(没插网线,客户拿来无线路由也不行) 错误信息是:无法获取网卡连接!(当然是翻译后的 ...
  • UCenter 作服务端:phpsso 与 Discuz! 分别作 UCenter 的客户端应用:phpsso 与 Discuz! 通过 UCenter 发生交互 经过测试仍然有问题,phpcms登陆,论坛可以实现同 ...
  •      一面后第二个工作日就通知二面了,效率很高,约的三点,我就屁颠屁颠的准时赶到百度大厦,到前台后让前台mm帮我联系下面试官,结果意外发生了,号码不对,联系不上了,就让一面的面试官大哥帮我联系下,我在大厅沙发上等 ...
  • 想必大家都不是张无忌,人家三十年才可以练成的乾坤大挪移,张无忌大侠两个时辰就可以搞定,作为一个普通的程序员,经常遇到很多新技术和新知识,it界就是这样,日新月异, 那么我们如何学习一门技术和新知识呢?下面是我粗浅的几 ...
  • 网易开通了一个开源软件的镜像站点,网址为: 信息来源 [url]http://blog.s135.com/post/399/[/url] [url]http://mirrors.163.com/[/url] 提供的镜 ...
  • DDC(Display Data Channel)是终端显示器用来告知个人计算机显示器信息(如分辨率.扫描频率等)的规格,也就是显示器与主机系统之间的通信方法,当然,这个规格的主要目的就是要实现即插即用(Plug & ...