为 Libvirt 添加 maxphysaddr 支持

https://blueprints.launchpad.net/nova/+spec/libvirt-maxphysaddr-support

该蓝图提出新的 flavor extra_specs 和 image properties,以控制 Libvirt 虚拟机中 vCPU 的物理地址位数。

问题描述

当启动具有 1TB+ RAM 的虚拟机时,默认的物理地址位数太小,导致启动失败 [1]。因此,需要一个旋钮来指定合适的物理地址位数。

用例

启动具有大 RAM 的虚拟机。

提议的变更

在 Libvirt v8.7.0+ 和 QEMU v2.7.0+ 中,可以使用以下 XML 元素指定物理地址位数 [2] [3]。前者意味着采用任何物理地址位数,后者意味着采用主机 CPU 的物理地址位数。

  • <maxphysaddr mode='emulate' bits='42'/>

  • <maxphysaddr mode='passthrough'/>

Flavor extra_specs 和 image properties

我建议为 flavor extra_specs 和 image properties 使用以下两个。当然,如果省略这些,行为与之前相同。

  • hw:maxphysaddr_mode 可以是 emulatepassthrough

  • hw:maxphysaddr_bits 接受一个正整数值。仅在指定 hw:maxphysaddr_mode=emulate 时才有意义且必须指定。

因此,整体的 flavor extra_specs 如下

openstack flavor set <flavor> \
  --property hw:maxphysaddr_mode=emulate \
  --property hw:maxphysaddr_bits=42

同样,但整体的 image properties 如下

openstack image set <image> \
  --property hw_maxphysaddr_mode=emulate \
  --property hw_maxphysaddr_bits=42

Nova 调度器变更

Nova 调度器也需要修改以考虑这两个属性。

hw:maxphysaddr_mode

根据 Libvirt 和 QEMU 版本,可能存在支持和不支持的主机混合。因此,添加新的 traits COMPUTE_ADDRESS_SPACE_PASSTHROUGHCOMPUTE_ADDRESS_SPACE_EMULATED 来检查计划的主机是否支持此功能。如果 flavor extra_specs 或 image properties 中指定了 hw:maxphysaddr_mode=passthrough,则会自动添加 trait:COMPUTE_ADDRESS_SPACE_PASSTHROUGH=required。对于 hw:maxphysaddr_mode=emulate,也一样。这可以在 ResourceRequest 类的 from_request_spec 方法中实现。

Passthrough 和 emulate 模式具有不同的属性。所以让我们分别考虑这两个模式。

对于 hw:maxphysaddr_mode=passthrough 的情况。在这种情况下,cpu_mode=host-passthrough 是一个要求,nova 调度已经考虑到了这一点,因此该提案不需要额外的修改。不能保证 nova 是否可以迁移实例。因此,管理员需要确保冷迁移和实时迁移的目标具有相似的硬件和软件。此限制与 cpu_mode=host-passthrough 类似。

对于 hw:maxphysaddr_mode=emulate 的情况。在 nova 调度中,有必要检查 hypervisor 是否至少支持 hw:maxphysaddr_bits。数值比较对于 flavor extra_specs 和 image properties 的实现方式不同,因此分为两种情况。

hw:maxphysadr_bits

可以使用 libvirt capabilities 获取 hypervisor 支持的最大位数 [4]

如果 hw:maxphysaddr_bits 设置为 flavor extra_specs,可以使用 ComputeCapabilitiesFilter 比较位数。例如,可以通过自动添加 capabilities:cpu_info:maxphysaddr:bits>=42 来实现。

如果 hw_maxphysaddr_bits 设置为 image properties,则使用 ImagePropertiesFilter 执行数值比较。

这些 filter 和 COMPUTE_ADDRESS_SPACE_EMULATED trait 也可以实现冷迁移和实时迁移。

备选方案

在将 maxphysaddr 选项引入 Libvirt 之前,它被指定为使用 QEMU comanndline 参数的解决方法。但是,nova 不允许这种替代方案。

此外,一些 Linux 发行版可能具有 host-phys-bits=true 的机器类型 [5]。例如,pc-i440fx-bionic-hpbpc-q35-bionic-hpb。但是,此替代方案存在以下两个问题,不能用于通用用例。

  • Ubuntu 包维护者正在将补丁应用于 QEMU [6]。这意味着它不包含在 vanilla QEMU 中,并且在其他发行版中不可用。

  • 这仅适用于 hw:maxphysaddr_mode=passthrough,不包括 hw:maxphysaddr_mode=emulate。由于 hw:maxphysaddr_mode=passthrough 需要使用 cpu_mode=host-passthrough [7],因此此替代方案不能与 cpu_mode=customcpu_mode=host-model 一起使用。因此,此替代方案不足以用于具有许多不同 CPU 型号的云。

对于调度,placement 目前不支持数值 traits,因此无法通过此机制检查 hypervisor 支持的最大位数。也可以使用 JsonFilter 执行数值比较。但是,JsonFilter 容易受到 HostState 及其子属性变化的影響,正如警告中所述 [10]。因此,此规范采用 ComputeCapabilitiesFilterImagePropertiesFilter

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

操作员应根据需要指定适当的 flavor extra_specs 或 image properties。

开发人员影响

升级影响

如前所述,新的 traits COMPUTE_ADDRESS_SPACE_PASSTHROUGHCOMPUTE_ADDRESS_SPACE_EMULATED 信号升级后的计算节点是否支持此功能。

实现

负责人

主要负责人

nmiki

其他贡献者

功能联络人

功能联络人

需要联络人

工作项

此规范跨多个开发周期解决。合并和缺失的项目分别如下所示。

合并的项目

  • 添加新的 traits 以检查 Libvirt 和 QEMU 版本 [8] [9]

缺失的项目

  • 添加新的 guest configs

  • 在 nova/api/validation/extra_specs/hw.py 中添加新的字段

  • 在 nova/objects/image_meta.py 中添加新的字段

  • 在 nova/virt/livbirt/config.py 中添加新的字段 LibvirtConfigCPU

  • 在 nova/virt/libvirt/driver.py 中添加新的字段 maxphysaddrcpu_info

  • 添加新的 flavor extra_specs 的文档和发布说明

  • ComputeCapabilitiesFilter 中支持 hw:maxphysadar_bits 数值比较

  • ImagePropertiesFilter 中支持 hw_maxphysaddr_bits 数值比较

依赖项

Libivrt v8.7.0+. QEMU v2.7.0+。

测试

添加以下单元测试

  • 检查建议的 flavor extra_specs 是否经过正确验证

  • 检查建议的 image properties 是否经过正确验证

  • 检查是否输出预期的 XML 元素

  • 检查是否正确添加和使用 traits

  • 检查 ComputeCapabilitiesFilter 中的新字段是否正确添加和使用

  • 检查 ImagePropertiesFilter 中的新字段是否正确添加和使用

文档影响

对于操作员,文档描述了建议的 flavor extra_specs 和 image properties 的含义以及如何设置它们。

参考资料

历史

修订版

发布名称

描述

2023.1 Antelope

引入

2023.2 Bobcat

重新提出

2024.1 Caracal

重新提出