为了改善基于Libvirt的Openstack云主机的性能,往往采用将虚拟机的vCPU与计算节点的pCPU进行绑定的方法来实现。
配置CPU绑核
0X01 控制节点设置CPU绑定策略
修改nova-scheduler配置/etc/nova/nova.conf:
scheduler_default_filters=...,NUMATopologyFilter,AggregateInstanceExtraSpecsFilter
重启nova服务:
systemctl restart openstack-nova-scheduler
配置主机组
创建两个机组aggregate:
# 创建绑核主机组agg_cpu_pinning nova aggregate-create agg_cpu_pinning # 创建非绑核主机组agg_cpu_unpinning nova aggregate-create agg_cpu_unpinning # 通过以下命令查看AGGREGATE_ID nova aggregate-list # 指定主机组的pinned配置 nova aggregate-set-metadata AGG_CPU_PINNING_ID pinned=true nova aggregate-set-metadata AGG_CPU_UNPINNING_ID pinned=false
将计算节点加入主机组:
# 将计算节点COMPUTER_NODE_1加入绑核主机组 nova aggregate-add-host AGG_CPU_PINNING_ID COMPUTER_NODE_1 # 将计算节点COMPUTER_NODE_2加入绑非核主机组 nova aggregate-add-host AGG_CPU_UNPINNING_ID COMPUTER_NODE_2
创建flavor:
# 语法形式 nova flavor-create [--is-public true] FLAVOR_NAME FLAVOR_ID RAM_IN_MB ROOT_DISK_IN_GB NUMBER_OF_VCPUS # 举个例子:名称为flavor_cpu_pinned/ID为1/内存8G/磁盘50G/vCPU数量4 nova flavor-create flavor_cpu_pinned 1 8192 50 4
配置flavor:
# 语法形式 openstack flavor set FLAVOR-NAME --property hw:cpu_policy=CPU-POLICY --property hw:cpu_thread_policy=CPU-THREAD-POLICY # 举个例子 openstack flavor set cpu_pinning --property hw:cpu_policy=dedicated --property hw:cpu_thread_policy=require
选项CPU-POLICY的参数值说明:
参数值 | 说明 |
shared | 默认值,允许虚拟机的vCPU在宿主机的pCPU上自由浮动。 |
dedicated | 将虚拟机的vCPU与宿主机的pCPU进行绑定。 |
选项CPU-THREAD-POLICY的参数值说明:
参数值 | 说明 |
prefer | 默认值,若宿主机没有开启超线程,vCPU将选择Core,若宿主机开启超线程,vCPU将优先选择同一核心上的Thread,且只会选择Thread而不会选择Core。 |
isolate | vCPU性能最好,若宿主机没有开启超线程,每个vCPU独占一个Core,若宿主机开启超线程,每个vCPU占用一个CPU核心中的一个Thread,但其他vCPU不能再使用该核心的任何其他Thread,也相当于每个vCPU独占一个Core。 |
require | vCPU数量最多,宿主机须启用超线程,vCPU将优先选择同一CPU核心上的Thread,当空闲线程的数量不足时,nova调度将报告失败,若宿主机没有开启超线程,则它不会显示在 Nova Scheduler 的调度名单中。 |
补充说明:
- 只有当 hw:cpu_policy=dedicated 时,参数 hw:cpu_thread_policy 才会生效。
- Openstack不会把pCPU的layout信息暴露给用户,用户配置CPU-POLICY和CPU-THREAD-POLICY后,nova实现绑定某个vCPU到pCPU。
- 强烈建议创建两个host-aggregate,cpu_pinning和cpu_unpinning,将这两个aggregate加入不同的计算节点,当然也可以通过其他方法来避免非绑核的虚拟机强占绑核虚拟机的CPU资源。
- 对配置了绑核的计算节点,不建议超分(虚拟机的CPU拓扑和绑定的CPU拓扑策略一致),即超分率为1.0。举例:对一台拥有2*vCPU的虚拟机进行绑核,则该虚拟机的CPU拓扑为1个socket、1个核心、2个线程。
- 设置 cpu_thread_policy=prefer | require 时,Nova分配策略尽量依次占满每个CPU,以减少Thread/Core碎片。
0x02 修改计算节点nova
指定计算节点上的实例能使用的CPUs,修改配置/etc/nova/nova.conf:
[DEFAULT] vcpu_pin_set = 1-15,^7,17-31,^21 # reserved_host_memory_mb=25600
计算节点上的实例只能使用“1-15和17-31”但不包含“7和21”的CPUs,然后重启nova服务。
0x03 控制节点指定flavor创建虚拟机
openstack server create --image IMAGE-NAME --nic net-id=NET-NAME --flavor FLAVOR-NAME INSTANCE-NAME
使用virsh dumpxml domID观察效果。
附加知识
修改已有主机组的CPU绑定配置
将现有flavor的metadata的主机组vcpu绑定属性设置为不绑定:
for FLAVOR in ` nova flavor-list | cut -f 2 -d ' ' | grep [0-9]* | grep -v "\-\-" | grep -v ID`; do nova flavor-key ${FLAVOR} set "aggregate_instance_extra_specs:pinned"="false"; done
将metadata中带有cpu_pinned的主机组vcpu绑定属性设置为绑定:
for i in `nova flavor-list | grep cpu_pinned | awk '{print $2}'`; do nova flavor-key $i set hw:cpu_policy=dedicated; nova flavor-key $i set aggregate_instance_extra_specs:pinned=true; done
手动配置CPU绑核
通过修改虚拟机XML配置文件指定vCPU与pCPU的绑定关系:
# 以下代码来自网络,仅作示例,若有侵权,请与我联系 # <vcpu placement='static' cpuset='0'>1</vcpu> ... <topology sockets='1' cores='1' threads='1'/> # virsh vcpupin instance-00008205 VCPU: CPU Affinity ---------------------------------- 0: 0 # virsh vcpuinfo instance-00008205 VCPU: 0 CPU: 0 State: running CPU time: 7.7s CPU Affinity: y--------------- <vcpu placement='static' cpuset='0,2,4,10,12'>5</vcpu> <cputune> <vcpupin vcpu='0' cpuset='0'/> <vcpupin vcpu='1' cpuset='2'/> <vcpupin vcpu='2' cpuset='12'/> <vcpupin vcpu='3' cpuset='10'/> <vcpupin vcpu='4' cpuset='4'/> </cputune> <topology sockets='1' cores='5' threads='1'/> # virsh vcpupin instance-00008205 VCPU: CPU Affinity ---------------------------------- 0: 0 1: 2 2: 12 3: 10 4: 4 # virsh vcpuinfo instance-00008205 VCPU: 0 CPU: 0 State: running CPU time: 35.4s CPU Affinity: y--------------- VCPU: 1 CPU: 2 State: running CPU Affinity: --y------------- VCPU: 2 CPU: 12 State: running CPU Affinity: ------------y--- VCPU: 3 CPU: 10 State: running CPU Affinity: ----------y----- VCPU: 4 CPU: 4 State: running CPU Affinity: ----y-----------
自动配置CPU绑核
以下脚本实现自动CPU绑核操作:
# 以下代码来自网络,若有侵权,请与我联系 # ssh_client = SSHClient(ip, user, password) cputune_subxml = "" cpuset = [] for cpu_pin in cpu_pin_info: cpu_pin_xml = ("" % (cpu_pin[0], cpu_pin[1])) cputune_subxml += cpu_pin_xml cpuset.append(str(cpu_pin[1])) sed_command = ("s|%s|g;" "s||g;" % (",".join(cpuset), len(cpu_pin_info), len(cpu_pin_info))) if cputune_subxml: sed_command += ("//,/<\\/cputune>/d;") sed_command += ("/%s<\\/cputune>" % cputune_subxml) command = ("EDITOR=\"sed -i \\\"%s\\\"\" virsh edit %s" % (sed_command, instance_name)) LOG.debug("Set cpu pinnig. command=%s" % command) ssh_client.exec_command(command)
原创文章禁止转载:技术学堂 » Openstack云平台性能优化·CPU绑核