为 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可以是emulate或passthrough。hw:maxphysaddr_bits接受一个正整数值。仅在指定hw:maxphysaddr_mode=emulate时才有意义且必须指定。
Nova 调度器变更¶
Nova 调度器也需要修改以考虑这两个属性。
根据 Libvirt 和 QEMU 的版本,可能存在支持和不支持的宿主机混合情况。因此,添加新的 traits COMPUTE_ADDRESS_SPACE_PASSTHROUGH 和 COMPUTE_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-hpb 和 pc-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=custom或cpu_mode=host-model一起使用。因此,这种替代方案不足以用于具有许多不同 CPU 型号的云。
对于调度,placement 目前不支持数字 traits,因此无法通过此机制检查 hypervisor 支持的最大位数。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
操作员应根据需要指定适当的 flavor extra_specs。
开发人员影响¶
无
升级影响¶
如前所述,新的 traits COMPUTE_ADDRESS_SPACE_PASSTHROUGH 和 COMPUTE_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 中添加新的字段
maxphysaddr到cpu_info添加新的 flavor extra_specs 的文档和发布说明
依赖项¶
Libivrt v8.7.0+. QEMU v2.7.0+。
测试¶
添加以下单元测试
检查建议的 flavor extra_specs 是否经过正确验证
检查是否输出预期的 XML 元素
检查是否正确添加和使用 traits
检查
ComputeCapabilitiesFilter中的新字段是否正确添加和使用
文档影响¶
对于操作员,文档描述了建议的 flavor extra_specs 的含义以及如何设置它们。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
2023.1 Antelope |
引入 |