Openstack云平台性能优化·CPU绑核

为了改善基于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 的调度名单中。

补充说明:

  1. 只有当 hw:cpu_policy=dedicated 时,参数 hw:cpu_thread_policy 才会生效。
  2. Openstack不会把pCPU的layout信息暴露给用户,用户配置CPU-POLICY和CPU-THREAD-POLICY后,nova实现绑定某个vCPU到pCPU。
  3. 强烈建议创建两个host-aggregate,cpu_pinning和cpu_unpinning,将这两个aggregate加入不同的计算节点,当然也可以通过其他方法来避免非绑核的虚拟机强占绑核虚拟机的CPU资源。
  4. 对配置了绑核的计算节点,不建议超分(虚拟机的CPU拓扑和绑定的CPU拓扑策略一致),即超分率为1.0。举例:对一台拥有2*vCPU的虚拟机进行绑核,则该虚拟机的CPU拓扑为1个socket、1个核心、2个线程。
  5. 设置 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绑核

精彩评论

3+8=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏