openstack 跨CPU热迁移问题处理

发布时间 2023-04-18 18:08:30作者: 苦逼挨踢男

先说结论:

网络上修改源代码的方法均无效,在最新版本中可以通过在/etc/nova/nova.conf workarounds中配置skip_cpu_compare_on_dest = True来控制是否跳过比较CPU,但是测试不成功,原因是迁移之前跳过了比较,但是迁移过程中会报错,导致无法迁移

vim /usr/lib/python3.6/site-packages/nova/virt/libvirt/driver.py
 9341         if not CONF.workarounds.skip_cpu_compare_on_dest:
 9342             # Compare CPU
 9343             try:
 9344                 if not instance.vcpu_model or not instance.vcpu_model.model:
 9345                     source_cpu_info = src_compute_info['cpu_info']
 9346                     self._compare_cpu(None, source_cpu_info, instance)
 9347                 else:
 9348                     self._compare_cpu(instance.vcpu_model, None, instance)
 9349             except exception.InvalidCPUInfo as e:
 9350                 raise exception.MigrationPreCheckError(reason=e)

可以通过配置cpu_mode的方式成功迁移,但虚拟机必须硬重启后才可以

解决方法:

在所有宿主机中/etc/nova/nova.conf  libvirt中添加配置

[libvirt]
cpu_mode=custom
cpu_model=IvyBridge-IBRS 

 

然后重启nova服务

systemctl restart libvirtd openstack-nova-compute

成功解决

原理说明:

openstack 默认情况下virt_type使用的是"kvm"。该模式一下,CPU model支持如下三种配置

  1. host-passthrough:libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,故性能是最好的。但是在热迁移时,它要求目的节点的 CPU 和源节点的一致。
  2. host-model: libvirt 根据当前宿主机 CPU 指令集从配置文件 /usr/share/libvirt/cpu_map选择一种最相配的 CPU 型号。在这种 mode 下,虚拟机的指令集往往比宿主机少,性能相对 host-passthrough 要差一点,但是热迁移时,它允许目的节点 CPU 和源节点的存在一定的差异。
  3. custom:这种模式下虚拟机 CPU 指令集数最少,故性能相对最差,但是它在热迁移时跨不同型号 CPU 的能力最强。此外,custom 模式下支持用户添加额外的指令集。该模式下,需要同时配置cpu_model选项。该选项的值参考/usr/share/libvirt/cpu_map目录。

根据 HEPSpec06 测试标准,这三种模式的性能分别如下

host-passthrough    100%

host-model              95.84%

custom                    94.73%


性能差异不大,如果不是追求极致性能或者创建好虚拟机后就不打算热迁移的,可以考虑第一种模式(host-passthrough),否则使用(custom)模式

由于集群涉及到的2种CPU型号

 Intel(R) Xeon(R) CPU E5-2650
 Intel(R) Xeon(R) Gold 5218 CPU

使用cpu_mode=custom模式

关于cpu_model参数的选择

前期测试发现E5系列cpu服务器上的虚拟机迁移至Gold系列服务器正常,反过来不行,应该是gold系列使用了新的指令集倒是e5无法识别

可以使用virsh capabilities | virsh cpu-baseline /dev/stdin命令查看服务器支持的指令集(E5系列)

# virsh capabilities | virsh cpu-baseline /dev/stdin
<cpu mode='custom' match='exact'>
  <model fallback='forbid'>IvyBridge-IBRS</model>
  <vendor>Intel</vendor>
  <feature policy='require' name='ds'/>
  <feature policy='require' name='acpi'/>
  <feature policy='require' name='ss'/>
  <feature policy='require' name='ht'/>
  <feature policy='require' name='tm'/>
  <feature policy='require' name='pbe'/>
  <feature policy='require' name='dtes64'/>
  <feature policy='require' name='monitor'/>
  <feature policy='require' name='ds_cpl'/>
  <feature policy='require' name='vmx'/>
  <feature policy='require' name='smx'/>
  <feature policy='require' name='est'/>
  <feature policy='require' name='tm2'/>
  <feature policy='require' name='xtpr'/>
  <feature policy='require' name='pdcm'/>
  <feature policy='require' name='pcid'/>
  <feature policy='require' name='dca'/>
  <feature policy='require' name='arat'/>
  <feature policy='require' name='md-clear'/>
  <feature policy='require' name='stibp'/>
  <feature policy='require' name='ssbd'/>
  <feature policy='require' name='xsaveopt'/>
  <feature policy='require' name='pdpe1gb'/>
  <feature policy='require' name='invtsc'/>
</cpu>

比较cpu适配

#E5 Server
virsh capabilities | virsh cpu-baseline /dev/stdin >cpu_E5.xml
#gold Server
virsh capabilities | virsh cpu-baseline /dev/stdin >cpu_gold.xml

将以上文件互相拷贝到对方服务器,然后比较

#E5 Server
virsh cpu-compare cpu_gold.xml.xml 
error: Failed to open file 'cpu_gold.xml.xml': No such file or directory

#gold Server
virsh cpu-compare cpu_E5.xml 
Host CPU is a superset of CPU described in cpu_E5.xml

可以发现gold可以兼容e5,所以cpu_model参数配置为E5服务器上(virsh capabilities | virsh cpu-baseline /dev/stdin)命令输出中的<model fallback='forbid'>IvyBridge-IBRS</model>

virsh capabilities | virsh cpu-baseline /dev/stdin
<cpu mode='custom' match='exact'>
  <model fallback='forbid'>IvyBridge-IBRS</model>
  <vendor>Intel</vendor>
  <feature policy='require' name='ds'/>
  <feature policy='require' name='acpi'/>
  <feature policy='require' name='ss'/>
...

cpu_model=IvyBridge-IBRS