基于主机架构选择访客 CPU 架构的 libvirt 驱动

https://blueprints.launchpad.net/nova/+spec/pick-guest-arch-based-on-host-arch-in-libvirt-driver

实现新的镜像元属性,允许为与主机架构不同的访客架构选择正确的 QEMU 二进制文件、CPU 架构和机器类型;例如,在 AArch64 主机上运行的 x86_64 访客,反之亦然。

问题描述

目前,在许多地方,Nova 的 libvirt 驱动程序会根据主机CPU 架构 caps.host.cpu.arch 来决定如何配置访客 XML。在物理硬件支持有限的非传统架构的情况下,这并非最佳方案。

因此,所有上述代码都需要进行重构,以便根据 访客 CPU 架构(即 guest.arch,应根据镜像元数据属性 hw_emulation_architecture 设置)做出这些决定。

相关的工作是区分可以通过 KVM(硬件加速)执行 AArch64、PPC64 等的主机,与只能通过纯模拟 TCG 执行的主机 — 这是为了确保访客不会被任意调度到无法进行硬件加速的主机上,从而失去性能相关的优势。

用例

  • 作为管理员/操作员,我希望允许由于替代物理架构类型的限制或缺乏而进行 CPU 架构模拟。

  • 作为管理员/操作员,我希望在 x86_64 上部署 AArch64、PPC64、MIPS、RISC-V 和 s390x 作为模拟架构。

  • 作为管理员/操作员,我希望在 AArch64 上部署 x86_64、PPC64、MIPS、RISC-V 和 s390x 作为模拟架构。

提议的变更

为了启用这个新的 CPU 架构规范,将引入一个镜像属性和一个额外的函数,用于检查和比较主机架构与所需的模拟架构。

注意

以下 hw_architecture 镜像属性与计算主机的物理架构相关。如果未为所需的架构提供物理节点,则实例将不会被配置。

为 LibvirtConfigGuest 获取操作系统架构

这利用 nova virt libvirt 配置来获取 os_arch 并使用检索到的值更新 hw_architecture 镜像元属性。通过此更改,我们可以在 nova virt libvirt 驱动程序中对 hw_architecturehw_emulation_architecture 值执行所需的比较。

if self.os_arch is not None:
    type_node.set("arch", self.os_arch)

允许通过镜像属性定义模拟架构

为了启用定义访客架构,将引入以下基于字符串的镜像元属性

  • hw_emulation_architecture

当未定义此镜像属性时,实例配置将像往常一样进行。下面的 3 个示例演示了该过程。

示例 1 当设置了两个镜像元属性时,模拟架构将优先,它将在支持模拟 AARCH64 或输入 AARCH64 替代任何受支持架构的 X86_64 主机上构建。

  • hw_emulation_architecture = AARCH64

  • hw_architecture = X86_64

示例 2 当设置了模拟镜像元属性时,模拟架构将优先,它将在支持模拟 X86_64 或输入 X86_64 替代任何受支持架构的任何主机上构建。

  • hw_emulation_architecture = X86_64

  • hw_architecture = <unset>

示例 3hw_emulation_architecture 属性未设置时,它将在原生支持指定架构的任何主机上构建。

  • hw_emulation_architecture = <unset>

  • hw_architecture = AARCH64 OR hw_architecture = X86_64

更新调度器 request_filter 以处理这两个架构字段

transform_image_metadata 函数中,我们将这两个架构属性添加到 prefix_map。这本身也需要添加额外的 os-traits 用于 hwcompute

def transform_image_metadata(ctxt, request_spec):
    """Transform image metadata to required traits.

    This will modify the request_spec to request hosts that support
    virtualisation capabilities based on the image metadata properties.
    """
    if not CONF.scheduler.image_metadata_prefilter:
        return False

    prefix_map = {
        'hw_cdrom_bus': 'COMPUTE_STORAGE_BUS',
        'hw_disk_bus': 'COMPUTE_STORAGE_BUS',
        'hw_video_model': 'COMPUTE_GRAPHICS_MODEL',
        'hw_vif_model': 'COMPUTE_NET_VIF_MODEL',
        'hw_architecture': 'HW_ARCH',
        'hw_emulation_architecture': 'COMPUTE_ARCH',
    }

更新 os-traits

以下是为支持模拟的计算 CPU 架构提出的 os-traits,而硬件架构包括 nova 对象字段中所有当前 nova 支持的架构。

TRAITS = [
    'AARCH64',
    'PPC64LE',
    'MIPSEL',
    'S390X',
    'RISCV64',
    'X86_64',
]

为了考虑到这些架构的模拟,将对 nova virt libvirt 驱动程序进行更新,以确保报告主机上可用的每个架构模拟器的计算能力 traits。

对模拟执行架构测试

为了促进 nova virt libvirt 驱动程序中的简单检查,以下函数会进行检查,并在定义时设置适当的访客架构。

def _check_emulation_arch(self, image_meta):
    emulation_arch = image_meta.properties.get("hw_emulation_architecture")
    if emulation_arch:
        arch = emulation_arch
    else:
        arch = libvirt_utils.get_arch(image_meta)
    return arch

利用通过处理 image_meta 字典值执行的实际检查。

arch = self._check_emulation_arch(image_meta)

建议的模拟架构和当前支持级别

使用此规范中提出的更改执行的所有测试表明,模拟的访客保持对所有基本生命周期操作的当前支持。以下是建议的架构及其当前的功能级别,计划所有架构都将 测试 验证 功能 支持

  • X86_64 - 已测试并验证功能支持

  • AARCH64 - 已测试并验证功能支持

  • PPC64LE - 已测试并验证功能支持

  • MIPSEL - 等待 libvirt 补丁以支持 PCI

  • S390X - 正在排查访客内核崩溃问题以支持功能

  • RISCV64 - 待测试

备选方案

已经尝试利用现有的镜像元属性,例如 hw_architecture;但是,这会引发各种其他问题,例如冲突的检查和核心代码的更改。这也会在实例调度期间遇到问题,因为将没有匹配的物理主机架构,而这是本规范旨在解决的问题。

虽然提供对所需 CPU 架构的实际物理支持是最佳选择,但它为更广泛的受众提供了在 OpenStack 环境中与 QEMU 一样执行相同类型的本地模拟的能力。

数据模型影响

  • 向 os-traits 添加一组新的标准 traits。

  • 向 image_meta 对象添加新属性。

  • OS 架构值将被拉入 LibvirtConfigGuest

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

预计这将通过减少重新调度来提高异构云中的启动性能。通过将更受约束的请求传递给 placement,此功能还应减少返回的 allocation_candidates 集合。

这将确保优先处理原生支持,而不是模拟,因为它需要设置特定的属性才能执行所需的检查。

其他部署者影响

确保物理节点上安装了所有所需的 QEMU 二进制文件,以支持您想要支持的 CPU 架构。

开发人员影响

升级影响

实现

负责人

主要负责人

chateaulav - Jonathan Race

功能联络人

功能联络人

需要联络人

工作项

  • 添加新的 traits

  • 更新 prefilter

  • 修改 nova libvirt virt 驱动程序以执行模拟架构检查

  • 向 image_meta 对象添加新属性

  • 修改 nova libvirt virt 配置以将 OS 架构拉入 LibvirtConfigGuest

  • 测试

依赖项

蓝图

项目变更集

Libvirt MIPs PCI Bug

测试

将添加单元测试以验证以下提出的更改

  • nova virt libvirt 驱动程序 以验证处理 hw_emulation_architecture 镜像属性值和相关检查。

  • nova scheduler request_filter 以确保正确处理 prefilter,并添加这两个新值。

建议的 tempest 更新将考虑到通过模拟支持的非原生架构。

  • AARCH64 架构将与每个补丁一起进行测试

  • 剩余架构将在 periodic-weeklyexperimental 管道中进行测试。

文档影响

将添加发布说明。由于存在最终用户影响,因此需要针对受支持的模拟架构类型和需要设置的所需的镜像元属性提供面向用户的文档。

参考资料

历史

修订版

发布名称

描述

瑜伽

引入