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! 官方文档有的时候很坑……

参考文档

  1. Pinning processors by common threads and cores
  2. https://wiki.openstack.org/wiki/VirtDriverGuestCPUMemoryPlacement

以上文档建议阅读

时间: 2024-10-07 12:27:02

openStack kvm 虚拟机CPU颗粒化控制的相关文章

KVM虚拟机cpu pinning实战

本文包含以下内容: 宿主机CPU特性查看 虚拟机CPU特性查看 KVM虚拟机cpu pinning如何配置 cpu pinning的应用场景 首先需求了解基本的信息 1 宿主机CPU特性查看 使用virsh nodeinfo可以看到一些基本信息 virsh nodeinfo CPU model: x86_64 CPU(s): 32 CPU frequency: 1200 MHz CPU socket(s): 1 Core(s) per socket: 8 Thread(s) per core: 

openstack kvm 虚拟机磁盘差异衍生

1, openstack虚拟实例备份之--多镜像格式多镜像文件合并为一个镜像文件衍生-差异镜像文件    /var/lib/nova/instances/b0abc22f-1a73-4079-b1bc-2aa28f43b952/disk 衍生基本镜像文件    /var/lib/nova/instances/_base/cc90d7cc302c711271e6376cda329df089781c76 qemu-img convert -c 衍生-差异镜像文件 衍生基本镜像文件 -O qcow2

openstack kvm 虚拟机手动迁移记录base img 整合 差异镜像

首先根据定位主机id 寻找主机的基镜像及差异镜像 qemu-img convert -c 衍生-差异镜像文件 衍生基本镜像文件 -O qcow2 one.qcow2; 原文地址:https://www.cnblogs.com/ruiy/p/12706163.html

Openstack 云计算 (一): kvm 虚拟机配置

Openstack 云计算 (一): kvm 虚拟机配置 标签(空格分隔):openstack系列 一:关于虚拟化 二:kvm 虚拟机 一. 关于虚拟化 1.1.虚拟化的概念 1. 系统虚拟化是将底层物理设备与上层操作系统,软件分离的一种去藕合技术,在一台物理集群上路径的划分出多台机器 2. 虚拟化的目录表是实现IT 资源利用效率和灵活的最大化 3. 产品vmware vsphere esxi 就是最典型的产品 1.2 虚拟化Hypervisor 在一台物理机上虚拟出多个虚拟计算机(虚拟机,Vi

OpenStack入门篇(四)之KVM虚拟机介绍和管理

1.查看虚拟机,启动虚拟机 [[email protected] ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7-x86_64 shut off [[email protected]-node1 ~]# virsh start CentOS-7-x86_64 通过TightVNC连接,修改网络vi /etc/sysconfig/network-sc

解决kvm安装windows7虚拟机cpu只有两个的问题

问题描述:使用下面的命令创建的虚拟机 virt-install --ram=2048 --vcpus=8 --os-type windows --os-variant=winvista \ --cdrom /ISOs/Windows_7_CHS_sp1_x86.iso --network bridge=br1 \ --disk path=/dev/vg/Office-QA-VS-102-85 --accelerate \ --vnc --vncport=5910 --noautoconsole 

KVM虚拟机,如何设置虚拟机的CPU型号与物理机是一样的

1.在kvm主机上修改配置文件 [[email protected] ~]# virsh edit CentOS-7.3-X86_64   将xml配置文件中的:   <cpu mode='custom' match='exact'>     <model fallback='allow'>IvyBridge</model>   </cpu> 修改为:   <cpu mode='host-passthrough'/> 2.kvm关于cpu型号的定

对KVM虚拟机进行cpu pinning配置的方法

这篇文章主要介绍了对KVM虚拟机进行cpu pinning配置的方法,通过文中的各种virsh命令可进行操作,需要的朋友可以参考下 首先需求了解基本的信息 1 宿主机CPU特性查看 使用virsh nodeinfo可以看到一些基本信息 #virsh nodeinfo CPU model: x86_64 CPU(s): 32 CPU frequency: 1200 MHz CPU socket(s): 1 Core(s) per socket: 8 Thread(s) per core: 2 NU

CentOS7.6中 KVM虚拟机内存、CPU调整

一.调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机 1.查看当前内存大小 [[email protected] kvm]# virsh dominfo test Id: 7 名称: test UUID: 8f2bb4b7-c7ed-31aa-3676-9fb04923163d OS 类型: hvm 状态: running CPU: 4 CPU 时间: 3985.0s 最大内存: 12024832 KiB 使用的内存: 12024000 KiB 持久: 否 自动启动: 禁用 管理的保存: 否