支持 x86 客户机上的高精度事件计时器 (HPET)

https://blueprints.launchpad.net/nova/+spec/support-hpet-on-guest

问题描述

用例

作为希望将现有设备迁移到云环境的最终用户,我希望能够请求具有 HPET 的客户机,以便可以在虚拟化和物理产品之间共享通用代码。

作为运营商,我希望支持为我的电信客户入职遗留 VNFs,在没有 HPET 的情况下无法修改客户机镜像使其正常工作。

提议的变更

最终用户可以通过指定镜像属性 hw_time_hpet=True 来表明他们希望在客户机中启用 HPET。

将新的镜像属性设置为“True”仅在与 hypervisor_type=qemu 以及 architecture=i686architecture=x86_64 组合使用时才能保证有效。

注意

将不会引入相应的 flavor extra spec,因为启用 HPET 实际上是每个镜像的问题,而不是容量规划中的资源问题。

正如下一节所述,考虑了几种使用 Traits 的方案,但我们最终选择了更简单的方法,原因如下

  1. HPET 由 qemu 通过模拟提供,因此不存在安全隐患,因为已经有更好的时钟源可用。

  2. HPET 默认关闭纯粹是因为 Windows 客户机上的时间漂移问题。(参见 nova 提交 ba3fd16605。)

  3. 模拟的 HPET 设备在 OpenStack 支持的所有版本的 libvirt/qemu 上都无条件可用。

  4. HPET 设备仅支持 x86 架构,因此在混合架构的云中,必须使镜像特定于 x86,以确保实例被调度到 x86 主机上。

  5. 最初,我们只会支持在 qemu 上启用 HPET。指定 hypervisor 类型将确保实例被调度到使用 qemu hypervisor 的主机上。如果适用(vmware 支持启用/禁用 HPET 的能力,我认为),也可以将其扩展到其他 hypervisor,并且支持哪些 hypervisor 可以在“有用的镜像属性”文档中记录。

备选方案

考虑了以下使用 Trait 的方案,但最终我们选择了一种更简单的方法,不使用 Trait。

显式 Trait,隐式 Config

运营商可以通过在 flavor extra-specs 中指定 placement trait trait:COMPUTE_TIME_HPET=required 来表明他们希望在客户机中启用 HPET。

最终用户可以通过上传带有相同 trait 的自己的镜像来表明他们希望在客户机中启用 HPET。

现有的 nova scheduler 代码会获取该 trait 并将其传递给 GET /allocation_candidates

一旦调度到计算节点,virt 驱动程序会查找 flavor/image 或 flavor 中编号请求组的 trait:COMPUTE_TIME_HPET=requiredtrait*:COMPUTE_TIME_HPET=required,并将其用作在客户机上启用 HPET 的提示。

如果最终到达 virt 驱动程序并且设置了该 trait,并且驱动程序出于某种原因(例如 flavor 中的值错误;最终位于不支持 HPET 的主机上等)确定它无法切换,则应失败。[1]

缺点:我们正在使用 trait 来影响客户机配置。

显式 Config,隐式 Trait

  • 运营商在 flavor 中指定 extra spec hw:hpet=True

  • Nova 识别到这是一个已知特殊情况,并将 required=COMPUTE_TIME_HPET 添加到 GET /allocation_candidates 查询中。

  • 驱动程序使用 hw:hpet=True extra spec 作为在客户机上启用 HPET 的提示。

缺点:将特殊的 extra spec 隐式转换为 placement-isms 比较晦涩。这不会是唯一的实例;我们需要在代码中组织“特殊”extra specs 以提高可维护性,并对其进行彻底的文档记录。

显式 Config,显式 Trait

  • 运营商在 flavor 中指定 both extra specs,hw:hpet=Truetrait:COMPUTE_TIME_HPET=required

  • 现有的 nova scheduler 代码会获取后者并将其传递给 GET /allocation_candidates

  • 驱动程序使用 hw:hpet=True extra spec 作为在客户机上启用 HPET 的提示。

缺点:运营商必须记住设置两个 extra specs,这是一种糟糕的用户体验。(如果她忘记了 hw:hpet=True,她最终会关闭 HPET;如果她忘记了 trait:COMPUTE_TIME_HPET=required,她可能会遇到后期失败的 NoValidHosts。)

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

可以忽略不计。

其他部署者影响

开发人员影响

升级影响

新的镜像属性只有在所有节点都升级后才能可靠地工作。

实现

负责人

主要负责人

jackding

其他贡献者

jaypipes, efried

工作项

  • libvirt 驱动程序更改以支持 HPET

依赖项

测试

将添加单元测试。

文档影响

更新镜像属性的用户文档 [2]

参考资料

历史

修订版

发布名称

描述

Stein

引入