libvirt 支持将 cyborg 拥有的 vGPU 组合到 domain XML¶
https://blueprints.launchpad.net/nova/+spec/cyborg-vgpu-support
此蓝图建议在 nova 和 cyborg 交互中启用 vGPU 加速器。
问题描述¶
为了允许操作员使用 cyborg 管理 vGPU 的生命周期,cyborg 需要发现 vGPU,将其报告给 placement,并指示 nova 将特定的 vgpu mdev 分配给实例。Cyborg 管理的 vGPU 不会取代 nova 的原生 vGPU 功能 [1],而是提供与现有 nova 功能并行的一种替代管理机制。
在当前的 cyborg-nova 交互中 [2],将 cyborg 拥有的 vGPU 分配给实例仍然存在一个小差距。此规范建议支持在 nova libvirt 驱动程序中将 cyborg 拥有的 vGPU 组合到 domain XML 中。
有关 cyborg 侧生命周期管理(发现、数据建模等)的 vGPU 的更多信息,请参阅 [3]。
用例¶
作为操作员,我希望使用 Cyborg 管理 vGPU 的生命周期。
提议的变更¶
在 arq 中定义数据模型以跟踪 cyborg 拥有的 vGPU。
此数据模型应提供 attach_handle_type 以与 PCI 设备加速器区分开来,以及 attach_handle_uuid 作为用于在 /sys/class/mdev_bus/… 中创建 mdev 设备的 mdev UUID,以及此设备的请求 vgpu 类型。格式如下:
{ 'attach_handle_type': 'MDEV', 'attach_handle_uuid': '91ac1606-427e-44bb-8233-f4ff4bf3d241', }
Nova virt 驱动程序将 arq 中的 mdev 信息合并到实例的 XML 中。
这需要从 arq 列表中获取 mdev,并将其传递到 nova/virt/libvirt/driver.py 中生成 guest xml [4]。请注意,以下只是伪代码,用于显示整个函数和过程。
# Get mdevs accelerators from ARQ list. mdev_arq_list = [arq for arq in acc_info if arq['attach_handle_type'] == 'MDEV'] mdevs.append(mdevs_accel) xml = self._get_guest_xml(context, instance, network_info, block_disk_info, image_meta, block_device_info=block_device_info, mdevs=mdevs) mdev_arq_list = [arq for arq in acc_info if arq['attach_handle_type'] == 'MDEV'] self._guest_add_accel_mdev_devices(guest, mdev_arq_list) def _guest_add_accel_mdev_devices(self, guest, acc_info): """Adding mdev accelerators from ARQ list. """ for arq in acc_info: self._guest_add_mdevs(guest, arq['attach_handle_uuid'])
Cyborg 在 sys 路径中创建 mdev 设备
从理论上讲,如果 nova 和 cyborg 都支持 vGPU 管理,nova 或 cyborg 应该支持在其各自的范围内创建 mdev。因此,在 cyborg 的 vGPU 生命周期管理中,cyborg 应该提前创建 mdev,nova virt 驱动程序将其用作现有资源。
spawn 实例交互(arq 交互部分)
nova-conductor 请求 cyborg 创建和绑定 arq
cyborg-api rpc.call cyborg-agent 创建一个新的 mdev
cyborg-agent 成功创建 mdev 并返回结果
cyborg 开始绑定 arq
cyborg arq 成功绑定并通知 nova ARQ 绑定已解决,适用于给定的实例
nova-compute 接收绑定通知并 GET 解决的 arq
nova-compute 调用 virt 驱动程序来 spawn 一个实例
reboot 实例交互:当 nova-compute 调用 cyborg GET arq API 时,cyborg 执行数据库查找并返回预期的 arq。
主机 reboot:在主机 reboot 后,cyborg 拥有的 vGPU 将从 sys 路径中丢失。cyborg agent 应该在启动时为所有绑定的 arq 创建 mdev。理想情况下,它还应该在启动时将绑定状态设置为“provisioning”。我们还应该有另一个状态“unknown”,如果 cyborg agent 错过心跳,cyborg-api 将报告该状态。因此,在启动时,当 nova compute 尝试获取 accel_info 并 reboot 所有实例时,它将看到 3 种状态之一:“bound”,如果 cyborg agent 首先启动并已完成绑定,“unknown”,如果 cyborg agent 尚未向 cyborg conductor 发送心跳,以及“provisioning”,如果 agent 正在创建 mdev。Cyborg 将在状态从“provisioning”更改为“bound”时发送相同的绑定完成事件通知,就像在正常的 arq 绑定期间一样。
避免 cyborg vGPU 管理与 nova vGPU 管理共存时的冲突。
在 inventory 报告时,在 Placement 中使用 owner(nova、cyborg)trait。
这需要添加一个新的命名空间到 os-traits:OWNER_*. 然后 nova/cyborg 将 owner trait OWNER_NOVA/OWNER_CYBORG 作为 trait 之一在 inventory 报告时报告。
在 cyborg 驱动程序中,它将使用以下格式为 vGPU 加速器报告两个 trait。有关更多详细信息,请参阅驱动程序规范 [3]。
trait1: OWNER_CYBORG. trait2: CUSTOM_<VENDOR_NAME>_<PRODUCT_ID>_<Virtual_GPU_Type>.
在 nova 侧,它需要在 inventory 报告期间为 vGPU 资源报告一个新的 trait OWNER_NOVA。
当最终用户发出 vGPU 请求时,对于 nova 拥有的 vGPU 请求,可以在 flavor 中指定
resources##:VGPU=1。对于 cyborg 拥有的 vGPU,需要在预定义的设备 profile 中指定,然后将其添加到 flavor 中。
在 libvirt 驱动程序中,使用 mdev_tag 来识别当前操作请求(例如,spawn、reboot)将着陆到哪个 vGPU。如果它是 cyborg vGPU,tag 将为“ACCELERATOR”,否则为“COMPUTE”。
这需要添加一个新的函数 _get_mdev_tag 来根据给定的 accel_info 识别它,并返回一个 tag mdev_tag:’COMPUTE’ 或 ‘ACCELERATOR’ 来指示这一点。
def _get_mdev_tag(self, accel_info): """Identify which vGPU is the current request going to land. parameter: accel_info return: mdev_tag('COMPUTE' or 'ACCELERATOR') """ if not accel_info: tag = 'COMPUTE' else: # here is just to show the logic specification if any arq in accel_info contains {arq['attach_handle_type'] == 'MDEV', arq['attach_handle_uuid'] and arq['attach_handle_info']['asked_type']}: tag = 'ACCELERATOR' else: tag = 'COMPUTE' return tag
相应地,我们还需要在 mdev_tag 的消费者侧进行新的更改,nova 操作侧,例如 hard_reboot 和 spawn。
备选方案¶
无
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
Deployer 应该确保一个 pci 地址中的设备未在 Nova 和 Cyborg 中配置。如果它同时在 Cyborg 和 Nova 中配置,应该能够将其作为冲突异常引发。如果 deployer 在 Cyborg 和 Nova 中配置相同的设备,它们可能会同时向 Placement 报告相同的数据,我们可以在 Placement 侧引发冲突异常,并返回到 Cyborg 或 Nova,并警告 deployer 关于冲突的设备。
开发人员影响¶
无
升级影响¶
对于那些想要从 nova 拥有的 vGPU 升级到 cyborg 拥有的 vGPU 的人,可以直接从具有 nova 管理 gpu(flavor 中的 resouces:vgpu=1)的 flavor resize 到具有 cyborg 管理 vgpu(accel:device-profile=cyborg-vgpu-device-profile-name)的 flavor。
实现¶
负责人¶
- 主要负责人
Wenping Song <songwenping@inspur.com>
- 其他贡献者
yumeng-bao
功能联络人¶
- 功能联络人
Brin Zhang <zhangbailin@inspur.com>
工作项¶
按设备 profile 调度 vGPU 资源
在 spawn guest 时创建 vGPU mdev
需要添加单元测试和功能测试
依赖项¶
无
测试¶
应该添加新的单元测试
文档影响¶
需要更改文档以描述此功能
参考资料¶
历史¶
发布名称 |
描述 |
|---|---|
Wallaby |
引入 |