PCI 直通组

https://blueprints.launchpad.net/nova/+spec/pci-passthrough-groups

此规范允许操作员使用 PCI 别名创建一个 flavor,以请求一组 PCI 设备。这些 PCI 设备组在 Placement 中被跟踪为单个不可分割的单元。用于跟踪这些 PCI 组的默认自定义资源类是从 PCI 组类型名称派生的,而库存名称是从 PCI 组名称派生的。pci_alias 配置已经支持映射到特定的 placement 资源类。

问题描述

有些 PCI 设备只有作为一组使用才有意义。当您将分组的 PCI 设备分配给 VM 时,组中的所有设备始终由单个 VM 共同使用。目前 Nova 不理解任何其他分组方式,除了 NUMA 亲和性。

虽然在某些情况下,设备可以被多个不同的组使用,并且根据需求动态选择,但我们现在忽略这些用例。特别是,我们做出了一个简化的限制,即跟踪的 PCI 设备只能属于一个组,并且当 PCI 设备是组的成员时,它只能作为该 PCI 组的一部分使用。

用例

有些 GPU 同时暴露图形物理功能和音频功能。为了支持直通这两个设备,我们需要确保直通匹配的设备对。此规范将允许创建设备组,以便操作员配置匹配的音频和图形设备对,用户可以通过通常的 PCI 别名请求其中一个(或多个)对。

请注意,我们目前排除用户请求设备对或仅请求图形设备用例,因为这将导致额外的复杂性,应在后续的单独规范中考虑。

让我们考虑 Graphcore C200 设备的具体情况,其中一组 PCI 卡通过 IPU-Link 连接在一起:https://docs.graphcore.ai/projects/C600-datasheet/en/latest/product-description.html#ipu-link-cables

每张物理卡提供两个 PCI 设备。如果向 VM 呈现匹配的设备对,则可以使用独立于其他卡。PCI 组允许通过确保始终将匹配的 PCI 设备对分配给每个 VM 来正确地将此设备直通到 VM。

此外,某些服务器可以静态配置为将两个设备、四个设备或八个设备分组为单个组。这些都可以使用 PCI 组静态配置,以确保我们始终尊重这些 PCI 设备之间的非 PCI 连接。

提议的变更

此更改的关键部分包括

  • 扩展 [pci]device_spec 以模拟 PCI 设备组

  • 设备通过组类型名称和特定组名称链接

  • 组类型名称用于生成自定义资源类,即 CUSTOM_PCI_GROUP<group_type_name>。请注意,这只是默认值,当您指定组类型名称时会更改,并且可以通过显式指定不同的 resource_class 标签来覆盖。

  • 每个组都在 placement 中注册,类似于设备。每个组都是一个单独的资源提供者,具有与关联组类型自定义资源类型对应的单个库存项,其名称是从 group_name 生成的,而不是 PCI 设备地址

  • 扩展 [pci]alias 简单地映射到上述资源类,例如 CUSTOM_PCI_GROUP_<group_type_name>.

  • PCI 跟踪器会将 group_name 和 group_type_name 添加到正在跟踪的每个设备,以便我们可以查找与 placement 中跟踪的特定命名组关联的设备组。

将进行配置验证检查

  • 仅当 PCI 设备在 placement 中被跟踪时才支持 PCI 组

  • 所有设备组必须具有两个或多个 PCI 设备

  • 每个物理 PCI 设备只能在一个组中,并且必须只在 placement 中跟踪一次

例如,让我们考虑以下 PCI 设备

  • 4e:00.0 处理器加速器:Graphcore Ltd 设备 0003

  • 4f:00.0 处理器加速器:Graphcore Ltd 设备 0003

  • 89:00.0 处理器加速器:Graphcore Ltd 设备 0003

  • 8a:00.0 处理器加速器:Graphcore Ltd 设备 0003

跨两个 NUMA 节点的两个物理卡可以以两种可能的方式呈现:两个组或单个组,具体取决于用例。例如,两个单独的设备将是:

[pci]
device_spec = {"address": ":4e:00.0", group_name:"graphcore_1", group_type:"c200_x1"}
device_spec = {"address": ":4f:00.0", group_name:"graphcore_1", group_type:"c200_x1"}
device_spec = {"address": ":4e:00.0", group_name:"graphcore_2", group_type:"c200_x1"}
device_spec = {"address": ":4f:00.0", group_name:"graphcore_2", group_type:"c200_x1"}
alias = {"name":"c200_x1", resource_class:"CUSTOM_PCI_GROUP_C200_X1"}

但是,将两个卡作为四个 PCI 设备的单个单元暴露出来,如下所示:

[pci]
device_spec = {"address": ":4e:00.0", group_name:"graphcore_1", group_type:"c200_x2"}
device_spec = {"address": ":4f:00.0", group_name:"graphcore_1", group_type:"c200_x2"}
device_spec = {"address": ":4e:00.0", group_name:"graphcore_1", group_type:"c200_x2"}
device_spec = {"address": ":4f:00.0", group_name:"graphcore_1", group_type:"c200_x2"}
alias = {"name":"c200_x2", resource_class:"CUSTOM_PCI_GROUP_C200_X2"}

备选方案

对于一些简单的情况,NUMA 亲和性可以模拟所需的内容。但目前像 Graphcore C200 这样的硬件在 Nova 中运行效果不佳。

数据模型影响

需要扩展 PCI 跟踪器以包含每个 PCI 设备的 group_name 和 group_type。

REST API 影响

无影响

安全影响

无影响

通知影响

无影响

其他最终用户影响

无影响

性能影响

无影响

其他部署者影响

设备规范配置获得一些额外的选项来帮助定义组,并且如上所述,当您使用新的 device_group 标签时,默认资源类会发生变化。

开发人员影响

升级影响

作为组暴露的设备在开始将其作为组暴露时当前不应在 placement 中被跟踪。

一旦新的计算节点报告了新的资源类,自然就会限制旧的计算节点了解如何处理新的 PCI 设备配置的需求。

实现

负责人

主要负责人

johngarbutt

其他贡献者

nathanharper

功能联络人

功能联络人

gibi?

工作项

  • 更新 pci 设备配置以支持 pci 组

  • 更新 PCI 设备跟踪器以了解 pci 组

  • 当设备别名请求映射到 PCI 设备组的资源类时,附加设备组

  • 使用描述的 pci 组更新 placement 中的可用资源

依赖项

测试

添加一个功能测试,类似于 vgpu 测试。

文档影响

配置更改需要正确记录。

参考资料

历史

可选部分,旨在每次更新规范时使用,以描述新的设计、API 或任何数据库模式更新。有助于让读者了解随着时间的推移发生了什么。

修订版

发布名称

描述

2024.1 Caracal

引入