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, ...
一周排行
  •     多线程:在一个程序中,这些独立运行的程序片断叫作"线程"(Thread),利用它编程的概念就叫作"多线程处理".   进程:是一个正在执行中的程序,每一个进程执行都有一 ...
  • 我最近接触了这样一个客户,对方的存储区域网络(SAN)遇到了崩溃,而且备份不可靠(或者说,更像是备份不存在),正想方设法恢复如初.还是长话短说吧,虽然我们在试图上电开启Hyper-V虚拟机,但是发现其中好几个虚拟机处 ...
  • 以前我曾一度傻乎乎的使用 always @ (posedge signal) 这样的代码去检测signal的上升沿,闹出了很多问题. 当受实验室的一同学指教后,再也不会傻乎乎的这样干了.当然,你看完下文也不会这样干了 ...
  • 在安装了最新版本的Python 3.x版本之后, 去参考别人的代码(基于Python 2.x写的教程),去利用print函数,打印输出内容时,结果却遇到print函数的语法错误: SyntaxError: inval ...
  • 为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语编程.记得之前学习C#的时候可以使用汉语作为 ...
  • 一.教程前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authenticati ...
  • 的确,IT产业将全球供应链与市场结合到一起.记者无意去研究宏观的IT环境,不过当记者把全部精力投入到安全上面的时候,有趣的结果产生了:安全也是平的. 从安全网关.防火墙.UTM.防病毒.IDS/IPS.VPN,到内网 ...
  • 在国外,百度被称之为中国版Google,早在2月份的时候CNN Money就曾发表了一篇文章,认为中国版Google已经超越了Google.现在,这一点被另一家媒体Tech in Asia证实,该媒体在3月初报道称, ...
  • 1,由函数 UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right )     2,position点是相对suerLa ...
  • 一.高级查询 1. 查询操作符 1.1 比较操作符$gt,$lt,$gte,$lte 实例: select * from things where field<value -- 等价于db.things.fin ...