为 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可以是emulate或passthrough。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_PASSTHROUGH 和 COMPUTE_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-hpb 和 pc-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=custom或cpu_mode=host-model一起使用。因此,此替代方案不足以用于具有许多不同 CPU 型号的云。
对于调度,placement 目前不支持数值 traits,因此无法通过此机制检查 hypervisor 支持的最大位数。也可以使用 JsonFilter 执行数值比较。但是,JsonFilter 容易受到 HostState 及其子属性变化的影響,正如警告中所述 [10]。因此,此规范采用 ComputeCapabilitiesFilter 和 ImagePropertiesFilter。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
操作员应根据需要指定适当的 flavor extra_specs 或 image properties。
开发人员影响¶
无
升级影响¶
如前所述,新的 traits COMPUTE_ADDRESS_SPACE_PASSTHROUGH 和 COMPUTE_ADDRESS_SPACE_EMULATED 信号升级后的计算节点是否支持此功能。
实现¶
负责人¶
- 主要负责人
nmiki
- 其他贡献者
无
功能联络人¶
- 功能联络人
需要联络人
工作项¶
此规范跨多个开发周期解决。合并和缺失的项目分别如下所示。
合并的项目¶
缺失的项目¶
添加新的 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 中添加新的字段
maxphysaddr到cpu_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 |
重新提出 |