openStack kvm 虚拟机CPU颗粒化控制
前一篇理解cpu topology对CPU Topology进行了学习总结,这里想总结下OpenStack下vCPU与pCPU常用的的绑定方式。 在尝试这些绑定之前,尤其是处理NUMA架构时还是建议看看前一篇文章,或者google一下相关概念,这样才能灵活自如。
使用启动参数isolcpus控制操作系统级别的CPU隔离
存在这样的一个需求,Compute节点操作系统自身与Hypervisor两个怎样才能隔离开,也就是不能让系统自身的服务占用了虚拟化资源。 解决起来很简单,就是指定操作系统只能用哪些cpu,而剩下的是留给hypervisor用的。具体的实现就是使用了isolcpus内核启动参数。
如isolcpus=4,5,6,7,8,表示系统启动后新进程不会使用4-8cpu,
isolcpus = [KNL,SMP]
format:
<cpu number>,...,<cpu number>
or
<cpu number>-<cpu number>
or
<cpu number>,...,<cpu number>-<cpu number>
isolcpus的原理也很简单:通过设置进程的cpu亲和性来实现.启动时设置init进程的亲和性,后续的进程均会继承init进程的亲和性设置. 这样就达到了整个系统的亲和性一致.如果后续的用户想修改亲和性可以通过
taskset来实现.
永久生效需要在grub中修改kernel的启动参数.
使用taskset设置进程亲和性
tasket使用非常简单,能够实时的进行cpu亲和性设置.
# 设置亲和性 taskset -cp mask pid
taskset -cp 0-3 1234
# 获取亲和性 taskset -cp pid
taskset -cp 1234
使用Cgroup进行Cpu QOS
Cgroup能够管理cpu资源.cgroup使用了特殊的文件系统,可以像正常的文件操作一样完成cgroup的设置.也可是使用特定的命令来进行设置.具体操作可以参考Linux的Cgroup
Cgroup能够控制隔离cpu资源,但是更多的是QOS功能.
vCPUs Bindings on KVM
virsh vcpupin guest1 4 0,1,2,3,8,9,10,11
主要是使用virsh vcpupin命令来实现,上面就是将虚机guest1的vcpu 4绑定到host的0,1,2,3,8,9,10,11上.
vCPUs Bindings On Openstack
I版的时候cpu bingdings非常简单,只要设置nova的vcpu_pin_set即可,也是挺粗糙的.
#nova.conf
[DEFAULT]
...
vcpu_pin_set=4-31
J版的时候社区完善了功能,可以针对numa特性来进行绑定了.在numa体系中玩binding不是那么简单了.理解cpu topology应该能提供一点帮助.
- Guest Numa策略 更多查看virt-driver-numa-placement bp
- hw:numa_nodes=NN - numa of NUMA nodes to expose to the guest.
- hw:numa_mempolicy=preferred|strict - memory allocation policy
- hw:numa_cpus.0= - mapping of vCPUS N-M to NUMA node 0
- hw:numa_cpus.1= - mapping of vCPUS N-M to NUMA node 1
- hw:numa_mem.0= - mapping N GB of RAM to NUMA node 0
- hw:numa_mem.1= - mapping N GB of RAM to NUMA node 1
- vCPUs与pCPUs的绑定,更多查看[vcpu与pcpu的绑定Virt driver pinning guest vCPUs to host pCPUs
- hw:cpu_policy=shared|dedicated
- hw:cpu_threads_policy=avoid|separate|isolate|prefer, 只有hw:cpu_policy为dedicated时本属性才生效
- avoid: the scheduler will not place the guest on a host which has hyperthreads.
- separate: if the host has threads, each vCPU will be placed on a different core. ie no two vCPUs will be placed on thread siblings
- isolate: if the host has threads, each vCPU will be placed on a different core and no vCPUs from other guests will be able to be placed on the same core. ie one thread sibling is guaranteed to always be unused,
- prefer: if the host has threads, vCPU will be placed on the same core, so they are thread siblings.
举例(未验证)
管理员可以设置flavor的元数据来控制vm行为.
nova flavor-key m1.large set hw:numa_mempolicy=strict hw:numa_cpus.0=0,1,2,3 hw:numa_cpus.1=4,5,6,7 hw:numa_mem.0=1 hw:numa_mem.1=1 hw:cpu_policy=decicated hw:cpu_threads_policy=separate
用户可以自己设置image元数据来达到定制需求,当然flavor的元数据优先级是高于image优先级的.
glance image-update image_id –property hw_numa_mempolicy=strict –property hw_numa_cpus.0=0,1,2,3 –property hw_numa_cpus.1=4,5,6,7 –property hw_numa_mem.0=1 –property hw_numa_mem.1=1 --property hw_cpu_policy=decicated --property hw_cpu_threads_policy=separate
上面的例子中,cpu的绑定hw:cpu_threads_policy参数其实是不起作用的,到M版代码中也没有相关实现.如果cpu_policy=decicated时,host开启超线程,相关vcpu会绑定在同一个core的threads上, 这样的绑定方式会导致vm性能很差, Be careful! 官方文档有的时候很坑……
参考文档
- Pinning processors by common threads and cores
- https://wiki.openstack.org/wiki/VirtDriverGuestCPUMemoryPlacement
以上文档建议阅读
openStack kvm 虚拟机CPU颗粒化控制的更多相关文章
- OpenStack+kvm虚拟机xml格式解析
配置说明 首先介绍一下配置结构: xml配置遵循<keyword> xxxxxx </keyword>的格式,即一个配置段以<keyword>开头,以</ke ...
- KVM虚拟机cpu资源限制和vcpu亲缘性绑定
前言 KVM中添加的实例存在资源分布不均的情况,这样如果有消耗资源的实例会影响到其他实例的服务正常运行,所以给kvm做资源限制是很有必要的,下面记录一下在centos7中KVM环境下使用cgroup限 ...
- KVM虚拟机CPU绑定性能调优(宿主机上操作)
获取kvm的pid ps -ef | grep kvm 通过pid找到vcpu在那个物理cpu上,没有绑定固定物理cpu时,执行下面命令可以看出vcpu在不同的物理cpu上切换重复执行 ps -eLo ...
- openstack kvm 虚拟机磁盘差异衍生
1, openstack虚拟实例备份之--多镜像格式多镜像文件合并为一个镜像文件衍生-差异镜像文件 /var/lib/nova/instances/b0abc22f-1a73-4079-b1bc ...
- KVM虚拟机CPU说明
废话不多说了,下面对kvm虚拟机的CPU说明做一梳理:NUMA技术介绍NUMA是一种解决多CPU共同工作的技术方案,我们先回顾下多CPU共同工作的技术架构历史.多CPU共同工作主要有三种架构,分别是S ...
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(3)--为虚拟机指定固定ip
之前在测试环境(centos7.2)上部署了openstack云平台(完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)--基础环境搭建),openstack在neutron组网 ...
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(6)--在线调整虚拟机的大小
前面提到过openstack环境部署及创建虚拟机的完整过程,然后有时候会发现创建的虚拟机规格太小,满足不了业务需求:亦或是虚拟机规格太大,容易造成资源浪费.于是就有了在线拉伸虚拟机规格的需求.所以,今 ...
- OpenStack入门篇(四)之KVM虚拟机介绍和管理
1.查看虚拟机,启动虚拟机 [root@linux-node1 ~]# virsh list --all Id Name State --------------------------------- ...
- CentOS7中KVM虚拟机内存、CPU调整
CentOS7中KVM虚拟机内存.CPU调整 1. 调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机 1.1 查看当前内存大小 [root@kvm01 ~]# virsh dominfo vm1- ...
随机推荐
- Django多对多的创建
1.多对多创建的应用场景: 在某表中创建一行数据是,有一个可以多选的下拉框 例如:创建用户信息,需要为用户指定多个爱好 2.创建方式: 方式一:自定义关系表,手动创建一张表用于关联其他多张表的关系 c ...
- 关于python2中的unicode和str以及python3中的str和bytes
python3有两种表示字符序列的类型:bytes和str.前者的实例包含原始的8位值:后者的实例包含Unicode字符. python2中也有两种表示字符序列的类型,分别叫做str和unicode. ...
- iOS 动态修改导航栏颜色 UINavigationBar
示例 所谓动态修改 意思是 在当前页面滚动的过程中 亦或 是在 触发返回事件\进入一个新的页面 导航栏的动态变化 由于系统级别的navBar 高度集成 很多自己想实现的功能 很不好弄 如果是通过 ...
- webpack打包笔记
optimist是一个node库,将webpack.config.js与shell参数整合成options对象 options对象包含之后构建的重要信息,类似于webpack.config.js we ...
- 20145229吴姗珊 《Java程序设计》两天小总结
20145229吴姗珊 <Java程序设计>两天小总结 教材学习内容总结 第十章 输入\输出 1.java将输入\输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象 2.从应用程序 ...
- Vim 标签定义
一.单个文件: m+标记字符 打上标记,如在开头行按ms(start),标记开头: 如需返回到自己的标记点,按`+标记字符就行: 二.多个文件: m+大写标记字符 如果删除了标签的行,同时也删除了标签 ...
- java入门了解07
1.集合: 1.1相比数组的优势: a.可以存储任意类型的对象数据,数组只能存储一种类型的变量 b.集合的长度会发生变化,数组不会 1.2集合概述 ----|Collection: 单列集合 ---- ...
- GIT使用[git remove untracked working file]
使用GIT进行merge的时候, git merge --no-ff master 如果merge之后出现问题, 想进行回退, 可以使用 git reset --hard HEAD 来回退到最新的版本 ...
- 一张图理解is_nll isset empty
isset 判断变量是否已存在,如果变量存在则返回 TRUE,否则返回 FALSE. empty 判断变量是否为空,如果变量是非空 或非零 的值,则 empty() 返回 FALSE.换句话说,&qu ...
- 十四 Django框架,中间件
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的se ...