在服务器上运行多个虚拟机,每台虚拟机的业务不同,造成不同程度的资源占用。为了避免相邻的虚拟机的干扰,需要将不同虚拟机的进程完全隔离,并且,OpenStack相关进程用于确保网络、存储等服务,故需要与其他进程隔离。
方法一:使用OpenStack配置
vcpu_pin_set = "0-3"
1
|
systemctl restart openstack-nova-compute.service |
1
|
openstack flavor set FLAVOR-NAME --property hw:cpu_policy=dedicated |
flavor配置可以根据业务实际场景配置,cpu_policy选项参考含义如下:
通过OpenStack 绑核方式无法显式指定vCPU。
方法二:使用virsh配置(推荐)
方法一无法显式指定vCPU,若需要根据业务需求,可以使用virsh方式显式绑核,操作如下:
1
|
nova show xxx |
1
|
virsh edit instance-000008f1 |
1 2 3 4 5 6 7 8 9 10 11 12 |
<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> |