整体需求

CPU模式可配置:Custom/HostMode

 

相关调研

libvirt 中,支持 3 种 cpu_mode

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

三种mode的性能排序是:host-passthrough > host-model > custom

三种mode的热迁移通用性是: custom > host-model > host-passthrough

 

根据 HEPSpec06 测试标准给出了如下性能数据。

host-passthrough

host-model

custom

100%

95.84%

94.73%

 

热迁移的角度

在选择 cpu-mode 时:

  • 需要充分考虑既有宿主机类型
  • 除非不存在热迁移的场景,否则不应用选择 host-passthrough
  • host-model 下不同型号的 CPU 最好能以 aggregate hosts 划分,在迁移时可以使用 aggregate filter 来匹配相同型号的物理机
  • 如果 CPU 型号过多,且不便用 aggregate hosts 划分,建议使用 custom mode

 

应用迁移的角度

对应用的影响主要体现在编译型应用,如 C,C++,Golang。在物理机上编译好的二进制应用,直接移植到 custom mode 的虚拟机有可能出现异常。

其中最常见的 SSE4 类型指令集异常,因为 custom 模式下没有 SSE4 指令集,而在物理机或者其它 mode 的虚拟机是有该指令集的。

  • host-model 能够平滑移植绝大部分编译型二进制文件。
  • custom 下的虚拟机如果出现 illegal instruction,在该虚拟机重新编译(有时需要修改编译参数)应用后,一般能正常运行。
  • 如果公司存在大量编译型应用,host-model 能让业务上云更平滑些

 

整体设计

修改 nova.conf

 

详细设计

编辑 /etc/nova/nova.conf,修改 libvirt 中的 cpu_mode 

[libvirt]
cpu_mode = custom

 

 

 

修改完成后重启 nova 服务