虚拟机绑核
目的
在服务器上运行多个虚拟机,每台虚拟机的业务不同,造成不同程度的资源占用。为了避免相邻的虚拟机的干扰,需要将不同虚拟机的进程完全隔离,并且,OpenStack相关进程用于确保网络、存储等服务,故需要与其他进程隔离。
方法
方法一:使用OpenStack配置
- 把“/etc/nova/nova.conf”文件中的vcpu_pin_set选项设置成为客户系统进程保留的CPU内核列表。例如,可以进行以下设置:
vcpu_pin_set = "0-3"
- 重启nova服务。
1
systemctl restart openstack-nova-compute.service
- 设置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上。
- 使用该flavor创建虚拟机。
通过OpenStack 绑核方式无法显式指定vCPU。
方法二:使用virsh配置(推荐)
方法一无法显式指定vCPU,若需要根据业务需求,可以使用virsh方式显式绑核,操作如下:
- 查询虚拟机实例名与所属计算节点,xxx为虚拟机名。
1
nova show xxx
- 到对应计算节点compute1上编辑虚拟机xml配置文件,instance-xxx为步骤一查询到的实例名。
1
virsh edit instance-000008f1
- 在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>
- 重启虚拟机。
1 2
virsh shutdown instance-000008f1 virsh start instance-000008f1
推荐策略
- 场景一
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>