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, ...
一周排行
  • 今天修改asp.net的webservice的类名时,出现了错误,错误是:   “/”应用程序中的服务器错误. 分析器错误 说明: 在分析向此请求提供服务所需资源时出错.请检查下列特定分析错误详细信息并适当地修改源文 ...
  • 漏洞:Espcms 通杀 SQL注入漏洞分析附EXP 漏洞作者:Seay 博客:www.cnseay.com 转载请保留以上内容… 官网介绍: 易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统, ...
  • 昨晚八点开始,腾讯公司注册了数万个五位数字和六位数字.cn域名,意在保护五位数和六位数QQ号域名.目前这些域名正在审核中.笔者发现,腾讯公司从昨天晚上八点开始一直持续到今日凌晨4点左右,将五数字.cn域名从10000 ...
  • 易网科技讯 2月1日消息,据国外媒体报道,英特尔将在今年晚些时候开始向设备生产商交付其具备3D晶体管的高性能Atom智能手机芯片,这些生产商之后将测试该种在手机中使用该芯片.这种Atom芯片的代码为Merrifiel ...
  • 最近在做websocket  porting的工作中,需要实现最底层socket读和写,基于同步读,libevent, libuv和android Looper都写了一套,从中体会不少.1)同步阻塞读写最开始采用同步 ...
  • 各位尊敬的CSDN用户:   你们好!我们将于3月25日上午对CSDN个人空间进行升级,升级完成后新版个人空间面向全体CSDN用户公测.   由于新版个人空间涉及多个社区产品集成,因此3月25日CSDN博客.论坛.p ...
  • 51CTO订制版纪念翻领T恤 此款翻领T恤衫,为51CTO特别订制版纪念T恤衫,为黑白两种颜色. 胸前印有51CTO的LOGO和51CTO的经典口号:技术成就梦想. 受到51CTO广大午饭的青睐.
  • 通货膨胀时代的80后们要学会投资 (声明:这只是我个人的一点片面见解,难免有错误或者不对不周到之处,希望大家批评指教!呵呵) 80后的我们很多已经开始走上社会了,一个属于我们的时代已经到来.这是一个最好的时代,是一个 ...
  •   痛并快乐着的C++学习之旅 ——书评<Exceptional C++>          “编程是件快乐的事情,它的快乐来自如下几点:第一.……:第二.……:第三.……:第四.这种快乐是持续学习的快乐 ...
  • XP系统文件夹图标显示成快捷方式的问题   WindowsXP中的图标出现混乱,甚至图标文件坏了而无法正常显示.   www.2cto.com   可到“C:\Documents and Settings\你现在的用 ...