闲谈虚拟化中的 CPU 模式
“读过书……我便考你一考。茴香豆的茴...哦不是,CPU的三种模式,你知道么”
在 OpenStack 中,CPU mode 的选取对于云平台的性能、稳定性发挥着至关重要的作用。本文将从性能、热迁移以及稳定性三个角度对 CPU mode 进行分析。
小学二年级的时候,老师就教过我们虚拟化的CPU机制,分别为 host-passthrough,host-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 能让业务上云更平滑些