基于 I/O (PCIe) 的 NUMA 调度

https://blueprints.launchpad.net/nova/+spec/input-output-based-numa-scheduling

基于 I/O 的 NUMA 调度将为分配了主机 PCI 设备的虚拟机添加智能 NUMA 节点放置支持,避免不必要的内存事务

问题描述

目前,虚拟化主机平台通常具有多 NUMA 节点特性。

最佳配置是将分配给虚拟机的 PCI 设备和 RAM 分配与同一 NUMA 节点关联。这将确保没有跨 NUMA 节点的内存流量。

要到达远程 NUMA 节点,内存请求必须遍历 CPU 之间的链路,并使用远程 NUMA 节点关联的内存控制器来访问远程节点。这会给远程 NUMA 节点内存访问带来延迟惩罚,这对于 NFV 工作负载来说是不利的。

Openstack 需要提供更细粒度的 NUMA 配置控制,以便提供更高性能、更低延迟的虚拟机应用程序。默认虚拟机放置策略是使用任何可用的 pCPU 或 NUMA 节点。

提议的变更

Libvirt 现在提供了 PCI 设备关联的 NUMA 节点,我们将使用此信息填充 nova DB。对于不提供此信息的 libvirt 版本,我们将添加一个回退机制来查询主机以获取此信息。

逻辑将被添加到 nova 调度器中,使其能够决定哪个主机最能满足虚拟机 PCI NUMA 节点的要求。

与将在 nova 调度器中实现的内容类似的逻辑将被添加到 libvirt 驱动程序中,使其能够决定将虚拟机放置在哪个 NUMA 节点。

备选方案

Libvirt 支持与 NUMA 守护进程 (numad) 集成,该守护进程监控 NUMA 拓扑和使用情况。它尝试为最佳 NUMA 局部性定位虚拟机,并动态调整以适应不断变化的系统条件。

这不足够,因为我们需要在 nova 中实现这种智能,用于主机选择和节点部署。

数据模型影响

PciDevice 模型将被扩展,以添加一个标识 PCI 设备关联的 NUMA 节点的字段。

numa_node = Column(Integer, nullable=False, default=”-1”)

一个 DB 迁移脚本将使用 ALTER_TABLE 在 nova DB 的 pci_devices 表中添加一个新列。

REST API 影响

REST API 将不会发生变化。

安全影响

此蓝图不会引入任何新的安全问题。

通知影响

此蓝图不会引入新的通知。

其他最终用户影响

此蓝图不会对最终用户产生任何其他影响。

性能影响

将虚拟机的 PCI 设备和 RAM 分配与同一 NUMA 节点关联的好处将提供最佳配置,与默认的 libvirt 虚拟机放置策略相比,将提高 I/O 吞吐量并降低内存延迟。

此功能会增加一些调度开销,但这种开销将提高主机性能。

此处描述的优化取决于虚拟机的 CPU 和 RAM 分配与同一 NUMA 节点关联。此功能在依赖部分引用的“Virt 驱动程序虚拟机 NUMA 节点放置和拓扑”蓝图中描述。

其他部署者影响

要使用此功能,部署者必须使用能够向操作系统报告 NUMA 相关信息的 HW。

开发人员影响

此蓝图不会对开发人员产生任何影响。

实现

负责人

主要负责人

James Chapman

其他贡献者

Przemyslaw Czesnowicz Sean Mooney Adrian Hoban

工作项

  • 为 pci_device 对象添加 NUMA 节点属性

  • 使用 libvirt 发现主机 PCI 设备 NUMA 节点关联

  • 启用 nova compute 将 PCI 设备 NUMA 节点关联与 nova DB 同步

  • 启用 libvirt 驱动程序配置虚拟机,并使用请求的 PCI 设备 NUMA 节点关联

  • 启用 nova 调度器决定哪个主机最能支持虚拟机

  • 启用 libvirt 驱动程序决定将虚拟机放置在哪个 NUMA 节点

依赖项

以下蓝图将定义调度器用于决定将虚拟机放置在哪个主机的策略。我们计划尊重此策略,同时扩展它以添加对 PCI 设备 NUMA 节点关联的支持。

Virt 驱动程序虚拟机 NUMA 节点放置和拓扑 * https://blueprints.launchpad.net/nova/+spec/virt-driver-numa-placement

以下蓝图将支持使用 SR-IOV NIC 参与 neutron 管理网络的用例。

启用 nova 实例使用 neutron SRIOV 端口启动 * https://blueprints.launchpad.net/nova/+spec/pci-passthrough-sriov

测试

将添加场景测试以验证这些修改。

文档影响

此功能不会添加新的调度过滤器,但由于它依赖于依赖部分中提到的 bp,我们需要扩展它们的过滤器。我们将根据需要添加文档。

参考资料

支持 NUMA 和 VCPU 拓扑配置 * https://blueprints.launchpad.net/nova/+spec/virt-driver-guest-cpu-memory-placement

Virt 驱动程序虚拟机 NUMA 节点放置和拓扑 * https://blueprints.launchpad.net/nova/+spec/virt-driver-numa-placement

启用 nova 实例使用 neutron SRIOV 端口启动 * https://blueprints.launchpad.net/nova/+spec/pci-passthrough-sriov