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的最新动态
- Add support for binding guest numa nodes to host numa nodes
社区review中。
提供了guest memory绑定策略的设置能力。
避免某些情况下由此导致的性能下降。 (比如PCI passthrough是设备DMA传输的情况?这点还是不太懂)
qemu配置方法范例:
-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访问带来的性能恶化。
http://blog.csdn.net/halcyonbaby/article/details/20152559
libvirt/qemu特性之numa的更多相关文章
- KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- 干货分享: 长达250页的Libvirt Qemu KVM的ppt,不实验无真相
下载地址:Libvirt Qemu KVM 教程大全 http://files.cnblogs.com/popsuper1982/LibvirtQemuKVM.pptx 1. 概论 1.1 虚拟化的基 ...
- KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- [daily][qemu][kvm] 使用qemu/kvm模拟numa节点
qemu的配置参数又复杂又难用,man手册写的也是非常对付,很多信息都没有. 而且,竟然遗弃掉旧的配置,换用新的配置.不过这也是好事,说明它在发展,我是欢迎的. 唯一的问题是,要经常跟着它一起更新配置 ...
- [ovs][libvirt][virtio][qemu] vhost user client 排障
ovs-dpdk + qemu 使用vhostuserclient通信,连路不通,libvirt报错如下: -- ::: starting up libvirt version: , package: ...
- KVM,QEMU,libvirt入门学习笔记【转】
转自:http://blog.csdn.net/julykobe/article/details/27571387 注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明. 0.虚拟 ...
- KVM+Qemu+Libvirt实战
上一篇的文章是为了给这一篇文件提供理论的基础,在这篇文章中我将带大家一起来实现在linux中虚拟出ubuntu的server版来 我们需要用KVM+Qemu+Libvirt来进行kvm全虚拟化,创建虚 ...
- 虚拟机迁移(QEMU动态迁移,Libvirt动(静)态迁移)
动静态迁移的原理 静态迁移是指在虚拟机关闭或暂停的情况下,将源宿主机上虚拟机的磁盘文件和配置文件拷贝到目标宿主机上.这种方式需要显式的停止虚拟机运行,对服务可用性要求高的需求不合适. *** 动态迁移 ...
- QEMU KVM Libvirt(12): Live Migration
由于KVM的架构为 Libvirt –> qemu –> KVM 所以对于live migration有两种方式,一种是qemu + KVM自己的方式,一种是libvirt的方式,当然li ...
随机推荐
- EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了
需求痛点 我们经常收到这样一种需求,就是将客户手里的各种类型的网络摄像机IPC和网络硬盘录像机NVR进行统一的整合接入和管理,并进行常规的直播.存储.录像检索和回放等操作,而这个时候我们通常会选择用E ...
- 图片热区——map的用法
<area>标记主要用于图像地图,通过该标记可以在图像地图中设定作用区域(又称为热点),这样当用户的鼠标移到指定的作用区域点击时,会自动链接到预先设定好的页面.其基本语法结构如下: 1 & ...
- PNG透明兼容IE6的几种方法
方法一:css方式,写一个属性hack,使用滤镜来解决png在ie6下不兼容的问题. _filter: progid:DXImageTransform.Microsoft.AlphaImageLoad ...
- ID生成策略
在电商项目中,图片名.商品ID都要唯一且方便存储,于是记录下这两个ID生成策略的方法,以便日后项目再有需要.具体代码如下 import java.util.Random; /** * 图片名生成 */ ...
- TFS二次开发-基线文件管理器(3)-源码文件的读取
TFS登录成功后,就可以开始读取源码目录树了. 一般来说,我不建议将整个树全部读取出来,因为这里不光存有项目文件,还有项目源码.如果全部读取出会是非常大的一棵树.因此我建议只读出根目录,每一次点击打开 ...
- django startapp报 maximum recursion depth exceeded
报错截图如下: 解决办法:修改指定路径下的functools.py文件的def total_ordering(cls):方法: 原来的样子: convert = { '__lt__': [('__gt ...
- 我的Android进阶之旅------>Android中通过adb shell input来模拟滑动、按键、点击事件
今天在维护公司的一个小项目的时候,发现按公司手机的某个物理按键,激活相应的Service后,会在屏幕上模拟的点击了屏幕的某个坐标点.好家伙,原来是之前该项目的版本是按这个物理按键后,会弹出一个对话框, ...
- 我的Android进阶之旅------>RGB颜色查询对照表
因为兼容性问题,色阶板功能只能在IE浏览器中运行 RGB颜色对照表 #FFFFFF #FFFFF0 #FFFFE0 #FFFF00 #FFFAFA #FFFAF0 #FFF ...
- 返回泛型集合的SqlDBHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Entity; ...
- junit在idea中的使用(1)--理论篇
感觉本文前部分配置太过繁琐,大家可以参考我的这篇文章http://www.cnblogs.com/SuMeng/p/8279879.html(junit在IDEA中使用--实践篇),用添加maven ...