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 |
引入 |