openstack 跨CPU热迁移问题处理
先说结论:
网络上修改源代码的方法均无效,在最新版本中可以通过在/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支持如下三种配置
- host-passthrough:libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,故性能是最好的。但是在热迁移时,它要求目的节点的 CPU 和源节点的一致。
- host-model: libvirt 根据当前宿主机 CPU 指令集从配置文件 /usr/share/libvirt/cpu_map选择一种最相配的 CPU 型号。在这种 mode 下,虚拟机的指令集往往比宿主机少,性能相对 host-passthrough 要差一点,但是热迁移时,它允许目的节点 CPU 和源节点的存在一定的差异。
- 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 CPU described in cpu_gold.xml is incompatible with host CPU #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