更新时间:2021-03-18 GMT+08:00
分享

虚拟机绑核

目的

在服务器上运行多个虚拟机,每台虚拟机的业务不同,造成不同程度的资源占用。为了避免相邻的虚拟机的干扰,需要将不同虚拟机的进程完全隔离,并且,OpenStack相关进程用于确保网络、存储等服务,故需要与其他进程隔离。

方法

方法一:使用OpenStack配置

  1. 把/etc/nova/nova.conf文件中的vcpu_pin_set选项设置成为客户系统进程保留的CPU内核列表。例如,可以进行以下设置:

    vcpu_pin_set = "0-3"

  2. 重启nova服务。

    1
    systemctl restart openstack-nova-compute.service
    

  3. 设置flavor为1v1绑核,FLAVOR-NAME为创建的实例类型名称。

    1
    openstack flavor set FLAVOR-NAME --property hw:cpu_policy=dedicated
    

    flavor配置可以根据业务实际场景配置,cpu_policy选项参考含义如下:

    • shared (default):不独占物理CPU 策略,允许 vCPU在不同的物理CPU间浮动。
    • dedicated:独占物理CPU 策略,虚拟机的 vCPU将会严格绑定到物理CPU上。

  1. 使用该flavor创建虚拟机。

    通过OpenStack 绑核方式无法显式指定vcpu。

方法二:使用virsh配置(推荐)

方法一无法显式指定vcpu,若需要根据业务需求,可以使用virsh方式显式绑核,操作如下:

  1. 查询虚拟机实例名与所属计算节点,xxx为虚拟机名。

    1
    nova show xxx
    

  2. 到对应计算节点compute1上编辑虚拟机xml配置文件,instance-xxx为步骤一查询到的实例名。

    1
    virsh edit instance-000008f1
    

  3. 在xml中进行如下配置:

    <domain type='kvm'>
    ...
    <vcpu placement = 'static' cpuset='4-7'>4</vcpu>
    <cputune>
    <vcpupin vcpu='0' cpuset='4'/>
    <vcpupin vcpu='1' cpuset='5'/>
    <vcpupin vcpu='2' cpuset='6'/>
    <vcpupin vcpu='3' cpuset='7'/>
    <emulatorpin cpuset='4-7'/>
    </cputune>
    ...
    </domain>

  4. 重启虚拟机。

    1
    2
    virsh shutdown instance-000008f1
    virsh start instance-000008f1
    

推荐策略

  • 场景一

    环境上存在多虚拟机的情况下,1v1绑核性能优于范围绑核。

    cpuset='4-7'用于控制qemu-kvm线程、其他工作线程仅能使用4-7这4个核,若不配置此参数,虚拟机的线程会在任意核上浮动,会存在更多的跨die和跨片损耗。

    vcpupin用于限制对cpu线程做一对一绑核。若不使用vcpupin绑cpu线程,则线程会在4-7这个4个核之间切换,造成额外开销。

  • 场景二

    虚拟机对内存带宽要求高的情况下,跨CPU Cluster绑核性能优于绑在同Cluster

    鲲鹏920系列处理器包含2个Super CPU Cluster(简称SCCL),每个SCCL包含6~8个CPU Cluster,每个CPU Cluster包含4个CPU Core。绑核时相同CPU Cluster的4个Core竞争会导致L3 Cache出现内存带宽瓶颈问题。

    因此,建议在虚拟化环境下,对虚拟机CPU绑核时尽量分布到多个CPU Cluster中,减少同一个CPU Cluster内多个Core竞争导致L3 Cache出现内存带宽瓶颈问题。

    虚拟机的vCPU跨CPU Cluster绑核,在负载低的情况下,其L3 Cache上的竞争会明显减小,可以最大的利用内存带宽。

    CPU绑核尽量分布到多个CPU Cluster上,其L3 Cache Tag上的竞争会明显减小,内存带宽和CPU计算性能可以相应提升。

    参考跨Cluster绑核方式如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <domain type='kvm'>
    ...
    <vcpu placement = 'static' cpuset='4,8,12,16'>4</vcpu>
    <cputune>
    <vcpupin vcpu='0' cpuset='4'/>
    <vcpupin vcpu='1' cpuset='8'/>
    <vcpupin vcpu='2' cpuset='12'/>
    <vcpupin vcpu='3' cpuset='16'/>
    <emulatorpin cpuset='4,8,12,16'/>
    </cputune>
    ...
    </domain>
    
分享:

    相关文档

    相关产品

close