“读过书……我便考你一考。茴香豆的茴...哦不是,CPU的三种模式,你知道么”

在 OpenStack 中,CPU mode 的选取对于云平台的性能、稳定性发挥着至关重要的作用。本文将从性能、热迁移以及稳定性三个角度对 CPU mode 进行分析。

小学二年级的时候,老师就教过我们虚拟化的CPU机制,分别为 host-passthroughhost-model 以及 custom ,如果连这道题都答不上来,怎么好意思出去和别人吹牛说自己是搞基础架构的(狗头)?

那么,先来看看这三种机制背后的原理吧。

在 host-passthrough 中 ,libvirt 令 KVM 将宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,所以这种模式下性能是最好的。但是这就带来了一个问题,在热迁移时,它要求目标节点的 CPU 和源节点保持一致。

而 host-model 的机制则是 libvirt 根据当前宿主机 CPU 指令集从配置文件 /usr/share/libvirt/cpu_map.xml 选择一种最相配的 CPU 型号。在这种模式下,虚拟机的指令集往往比宿主机少,性能相对 host-passthrough 要差一点,但是热迁移时,它允许目的节点 CPU 和源节点的存在一定的差异。

最后就是 custom 了, 这种模式下虚拟机 CPU 指令集数量最少,所以它的性能相对最差,但是在热迁移时跨不同型号 CPU 的能力最强。此外,custom 模式下支持用户添加额外的指令集。

综上所述,我们不难得出以下结论。

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

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

有机构专门做过一个测试,根据 HEPSpec06 测试标准,这三种模式的性能分别如下

host-passthrough host-model custom
100% 95.84% 94.73%

可以看出这三种模式的性能差距并没有我们想象中的那么大,除非对CPU指令集有特殊要求,一般情况下不建议使用 host-passthough。

下面我们分别从热迁移和应用迁移的角度聊聊这个问题。

热迁移的角度

在选择 cpu-mode 时:

  • 应充分考虑既有宿主机(CPU)的类型
  • 如果你有热迁移的需求,且无法保证集群中机器具有相同CPU指令集的情况下,不建议选择 host-passthrough
  • host-model 下不同型号的 CPU 最好能以 aggregate hosts 划分,在迁移时可以使用 aggregate filter 来匹配相同型号的物理机,以提升稳定性
  • 如果 CPU 型号过多,且不便于使用 aggregate hosts 划分,则建议使用 custom mode

应用迁移的角度

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

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

所以

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

很惭愧,做了一点微小的分享,谢谢大家。

发表评论

邮箱地址不会被公开。 必填项已用*标注