vCPU 的型号与热迁移

CPU 架构(型号)决定了 CPU 的性能及其应用特性,例如:Intel E5 系列的 CPU,主频相同的 Hasewell 架构就比 IvyBridge 架构的性能要高。在规模较大的 OpenStack 环境中,可能会存在多种不同 CPU 架构的服务器。从而导致 Compute Node 计算能力与特性的不同,随之带来的问题是:

  1. 不同 CPU 架构的服务器之间无法进行虚拟机热迁移。
  2. 无法统一虚拟机性能。

Libvirt 主要支持三种 CPU mode

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

Nova 虚拟机的 vCPU 架构

大多数情况下,可以通过计算节点的配置文件 nova.conf 来指定 GuestOS 的 CPU 架构:

  • libvirt_cpu_mode:用于设置虚拟机使用的 CPU 模式。如果 Libvirt virt_type 为 kvm | qume,那么默认值为 host-model,否则默认值为 None。
  • host-model:克隆宿主机的 CPU feature flags(功能标签)。
  • host-passthrough:克隆主机的 CPU 架构。
  • custom:使用 named models 的 CPU 模型。
  • none:不设置任何 CPU 模型
  • libvirt_cpu_model:设置虚拟机使用的 CPU 模型的名称,只能使用 /usr/share/libvirt/cpu_map.xml 文件中的一个 named models。
  • NOTE 1:只有虚拟机化类型为 kvm 或 qemu 需要使用该配置项。
  • NOTE 2:当 libvirt_cpu_mode 设置为 custom 时,才能使用该配置,否则将导致错误,虚拟机也无法启动。

需要注意的是,实际环境中多采用 Intel E5 系列的 CPU,但是该系列的 CPU 也有多种型号,常见的有 Xeon,Haswell,IvyBridge,SandyBridge 等等。

即使 Libvirt 使用了 host-model,在这些不同型号的 CPU 之间进行虚拟机热迁移也有可能失败。所以从热迁移的角度,在选择 host-mode 时应该注意:

  1. 需要充分考虑既有宿主机的 CPU 类型,以后采购扩容时,也需要考虑类型相同的问题。
  2. 存在热迁移的场景,应用选择 host-passthrough。
  3. host-model 下,不同型号的 CPU 最好能以 Host Aggregate 划分,在迁移时可以使用 HostAggregate Filter 来匹配具有相同 CPU 型号的计算节点,e.g.
openstack aggregate create Broadwell
openstack aggregate create Haswell
openstack aggregate set --property cpu=broadwell Broadwell
openstack aggregate set --property cpu=haswell Haswell
openstack aggregate add host <host1> Haswell
openstack flavor set --property aggregate_instance_extra_specs:cpu=broadwell <flavor1>
openstack flavor set --property aggregate_instance_extra_specs:cpu=haswell <flavor2>
  1. 如果 CPU 型号过多,而且不便于使用 HostAggregate 来做划分,建议使用 custom mode。