为附带 PCI 设备的 NUMA 节点预留资源¶
https://blueprints.launchpad.net/nova/+spec/reserve-numa-with-pci
自从 Juno 版本以来,绑定了 PCI 设备的实例必须调度到至少一个与 PCI 设备关联的 NUMA 节点 [1]。不幸的是,调度器并没有得到增强,以确保没有 PCI 设备的实例不会不必要地占用 NUMA 节点。本规范建议优化调度器,以确保这些 NUMA 节点被预留,从而增加部署者可以同时启动附带 PCI 设备和非 PCI 设备的实例数量。
问题描述¶
I/O 设备的 NUMA 局部性是配置高性能、低延迟系统以用于 NFV 工作负载时需要考虑的一个重要特性。“基于 I/O (PCIe) 的 NUMA 调度”蓝图通过确保绑定到 PCI 设备的实例(通过 PCI 直通请求)的调度得到优化,从而实现 PCI 设备和 CPU 的 NUMA 节点共置,从而优化了实例的放置。然而,即使只有少数这些节点与 PCI 设备等特殊资源关联,调度器仍然线性地使用节点。因此,没有 PCI 设备要求的实例可以填充附带 PCI 设备的宿主 NUMA 节点,这会导致 PCI 绑定实例的调度失败。
用例¶
作为操作员,我希望为实际需要它们的客户预留带有 PCI 设备的节点,这些节点通常价格昂贵且资源非常有限。
作为启动需要 PCI 设备的实例的用户,我希望云平台确保它们可用。
提议的变更¶
增强过滤调度器和资源跟踪器,使其优先为非 PCI 实例选择没有 PCI 设备的 NUMA 节点。
如果实例绑定到 PCI 设备,那么现有行为规定将至少使用与 PCI 设备关联的 NUMA 节点。
如果实例未绑定到 PCI 设备,那么将优先选择没有 PCI 设备的宿主。如果不存在满足此和其他要求的宿主,那么将使用带有 PCI 设备的宿主,但将优先选择没有关联 PCI 设备的 NUMA 节点。
带有 PCI 设备的实例仍然必须调度到带有 PCI 设备连接的节点上。启用某种“软亲和性”,不再要求这样做,超出了本蓝图的范围。
备选方案¶
添加一个配置选项,允许实例调度到与 PCI 设备无关的节点。这将确保实例可以充分利用资源,但不能解决非 PCI 实例占用首选 NUMA 节点的问题。这应该被视为一种补充,而不是替代方案。
确保 PCI 设备放置在与最高编号的 NUMA 节点关联的 PCI 插槽中。基于 PCI 的实例将始终使用这些插槽,而非 PCI 实例将被分配到节点线性(因此,首先分配到最低的节点)。然而,这将意味着移动成百上千个 PCI 设备,并且需要基于扩展而不是打包的主机调度方法。
使用宿主聚合代替。这不需要任何新功能,但如果宿主没有在所有节点上均匀地提供 PCI 可用性,或者如果实例消耗了宿主上的所有 PCI 设备但不是所有 CPU,则会失败。在两种情况下,所述宿主上的某些资源都会被浪费。
使用宿主聚合代替。这不需要任何新功能,但它将需要以非常静态的方式限制部署的容量,以最大限度地提高 PCI 实例成功调度的机会。
宿主聚合对于将固定实例与未固定实例分离是有意义的,因为调度一个未固定的实例实际上会破坏使用固定的全部目的(未固定的实例将在所有可用宿主核心上浮动,包括固定核心,从而抵消了固定带来的性能提升)。这是一个严格的要求。对于 PCI 的情况,另一方面,如果在 PCI 功能宿主上调度一个非 PCI 实例,不会发生任何坏事:我们只是会减少 PCI 宿主上需要它们的实例的容量。这并不意味着尝试限制非 PCI 设备使用 PCI 功能宿主是一件坏事:使调度器“更智能”并最大限度地提高实例成功调度的机会始终是一件好事。然而,人为地限制可用资源是非常糟糕的。无论您是否拥有统一的硬件,您都不太可能拥有统一的工作负载,并且您拥有的 PCI 与非 PCI 工作负载的数量随时间变化的可能性非常大。这使得宿主聚合成为解决此问题的糟糕方案。
数据模型影响¶
无。
REST API 影响¶
无。
安全影响¶
无。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
将添加一个额外的称重器,它将评估宿主每个节点上的 PCI 设备数量。由于所有称重器默认启用,这将在过滤过程中导致轻微的延迟增加。然而,这种影响与正确亲和化 PCI 设备带来的性能提升相比将微不足道,也不会产生充分利用所有可用硬件所节省的成本。
其他部署者影响¶
PCI 称重器将添加到 nova.scheduler.weights.all_weighers。但是,部署者可以使用 filter_scheduler.weight_classes 配置选项手动启用它。
开发人员影响¶
无。
实现¶
负责人¶
- 主要负责人
sfinucan
工作项¶
添加一个新的
PCIWeigher称重器类,以便在实例未附加 PCI 设备时优先选择没有 PCI 设备的宿主,反之亦然修改调度代码,以便在实例未附加 PCI 设备时优先选择没有附加 PCI 设备的 NUMA 节点上的核心
依赖项¶
无。
测试¶
单元测试
功能测试,该测试将伪造 libvirt 资源报告,但实际上将测试调度器
文档影响¶
将添加一个新的称重器。这应该在 此处 进行记录。
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
Pike |
引入 |