为 Libvirt 添加 maxphysaddr 支持

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

这份蓝图提出新的 flavor extra_specs 来控制 Libvirt 虚拟机中 vCPU 的物理地址位数。

问题描述

当启动具有 1TB+ 内存的虚拟机时,默认的物理地址位数太小,导致启动失败 [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

我建议以下两种 flavor extra_specs。当然,如果省略这些,行为与之前相同。

  • hw:maxphysaddr_mode 可以是 emulatepassthrough

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

Nova 调度器变更

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

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

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。可以使用 libvirt capabilities 获取 hypervisor 支持的最大位数 [4]。因此,可以使用 ComputeCapabilitiesFilter 在调度中比较位数。例如,可以通过自动添加 capabilities:cpu_info:maxphysaddr:bits>=42 来实现。冷迁移和实时迁移也可以使用此过滤器和 COMPUTE_ADDRESS_SPACE_EMULATED trait 来实现。因此,整体的 flavor extra_specs 如下

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

注意

由于 ComputeCapabilitiesFilter 仅支持 flavor extra_specs,不支持镜像属性 [5],因此此提案不涉及镜像属性。

备选方案

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

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

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

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

对于调度,placement 目前不支持数字 traits,因此无法通过此机制检查 hypervisor 支持的最大位数。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

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

开发人员影响

升级影响

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

实现

负责人

主要负责人

nmiki

其他贡献者

功能联络人

功能联络人

需要联络人

工作项

  • 添加新的 guest configs

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

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

  • 添加新的 traits 来检查 Libvirt 和 QEMU 版本

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

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

依赖项

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

测试

添加以下单元测试

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

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

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

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

文档影响

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

参考资料

历史

修订历史

发布名称

描述

2023.1 Antelope

引入

2023.2 Bobcat

重新提出