# PVE之CPU类型深入探究

Table of Contents

家里集群混合了英特尔和AMD一共3个系列的处理器,为了迁移和HA兼容性就顺便研究了一下QEMU虚拟化的CPU等配置。

省流

  • 单机或同系列CPU选择 host 或该系列代号最新版本(如 EPYC-Rome-v4 )即可。

  • 集群选择最旧 CPU 的 x86-64 ABI 兼容等级(如 Broadwell 和 EPYC Milan 集群选择 x86-64-v3)。

  • win7等老系统选择 i440fx,新的系统选择 q35,有直通设备打开 virtio

  • SCSI 控制器尽可能选择 VirtIO SCSI single

我自用的配置

以下是详细的研究笔记。

CPU配置

安全从业老哥的文章中,可以窥见,随着时代发展,长寿的 x86-64 架构也经历了多次升级。新的指令集与命令加入显著地提高了运行效率并且增加了不少 CPU 功能。撇去过于古老的 baseline(v1,代表为IvyBridge、3-4代酷睿),较为常见的有 v2-v4 架构。

x86-64各版本

kvm64 (x86-64-v1): Compatible with Intel CPU >= Pentium 4, AMD CPU >= Phenom.

x86-64-v2: Compatible with Intel CPU >= Nehalem, AMD CPU >= Opteron_G3. Added CPU flags compared to x86-64-v1: +cx16, +lahf-lm, +popcnt, +pni, +sse4.1, +sse4.2, +ssse3.

x86-64-v2-AES: Compatible with Intel CPU >= Westmere, AMD CPU >= Opteron_G4. Added CPU flags compared to x86-64-v2: +aes.

x86-64-v3: Compatible with Intel CPU >= Haswell, AMD CPU >= EPYC. Added CPU flags compared to x86-64-v2-AES: +avx, +avx2, +bmi1, +bmi2, +f16c, +fma, +movbe, +xsave.

x86-64-v4: Compatible with Intel CPU >= Skylake, AMD CPU >= EPYC v4 Genoa. Added CPU flags compared to x86-64-v3: +avx512f, +avx512bw, +avx512cd, +avx512dq, +avx512vl.

Qemu文档可以快速根据自己的处理器架构查到对应的 x86-64 ABI 兼容版本。或者更简单粗暴地,认为支持 SSE4.2 即支持 v2,支持 AVX2 即支持 v3,支持 AVX512 即支持 v4。也可通过在宿主 Linux 机器上运行一个简单的脚本自动地判断:

#!/usr/bin/awk -f
BEGIN {
while (!/flags/) if (getline < "/proc/cpuinfo" != 1) exit 1
if (/lm/&&/cmov/&&/cx8/&&/fpu/&&/fxsr/&&/mmx/&&/syscall/&&/sse2/) level = 1
if (level == 1 && /cx16/&&/lahf/&&/popcnt/&&/sse4_1/&&/sse4_2/&&/ssse3/) level = 2
if (level == 2 && /avx/&&/avx2/&&/bmi1/&&/bmi2/&&/f16c/&&/fma/&&/abm/&&/movbe/&&/xsave/) level = 3
if (level == 3 && /avx512f/&&/avx512bw/&&/avx512cd/&&/avx512dq/&&/avx512vl/) level = 4
if (level > 0) { print "CPU supports x86-64-v" level; exit level + 1 }
exit 1
}

在追求最大兼容的情况下,根据得到的 CPU ABI 兼容等级,即可挑选适合自己的虚拟CPU类型了。

当然,在单机运行或硬件统一的时候,也可以直接使用PVE为我们提供的命名类型或特性直通。单机/同型号处理器因为不存在迁移后宿主 CPU 支持指令集不同的问题,可以直接使用 host 取得最大性能。而在集群硬件同代但具体型号有别(如 E5 2686v4 + E5 2690v4)时,则可以采用该架构对应的命名类型。同时为避免硬件漏洞影响虚拟机安全,尽量选择最新的修订版(在 E5v4 的例子里就是 Broadwell-noTSX-IBRS)。

kvm类型已弃用

还要注意,有一个常见误区是默认使用已弃用的 kvm64,其实现在默认应该使用较新的 qemu64

BIOS、机型与SCSI控制器

这两都不需要想太多,按需即可。BIOS 引导就使用 SeaBIOS,要 UEFI 引导就使用 OVMF

老旧的操作系统(如使用 EHCI 的 win7)使用 i440fx,较新的使用 q35 即可。另外,需注意 PCIe直通 功能必须使用 q35

SCSI 控制器若无特殊情况直接选 VirtIO SCSI Single 即可,根据PVE官方文档,这是性能最佳的选择。

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

Comments