Windows 图形显示驱动开发-WDDM 3.2-GPU-P 设备上的实时迁移(一)
本文介绍了通过 SR-IOV(单根 I/O 虚拟化)分区虚拟化的异构计算设备(GPU、NPU 等)实时迁移的功能设计。 通过 WDDM 和 MCDM 驱动程序模型支持分区的设备现已成为我们虚拟化产品不可或缺的一部分。 因此,必须支持实时迁移并帮助我们的虚拟化抽象实现最大程度的可靠性,以避免资源分配必须改变时对客户造成的影响。 本文还介绍了这些设备的快速迁移。
从 Windows 11 版本 24H2 (WDDM 3.2) 开始支持实时迁移。 更广泛地说,它是 GPU 半虚拟化 (GPU-P) DDI 的扩展,用于公开该功能的驱动程序。 实施 GPU-P 虚拟化接口的 MCDM 驱动程序也可选择实施这些实时迁移接口,包括其与分流事件的扩展。
在本文中,“GPU”仅指实施 GPU-P 虚拟化框架的设备,无论是 WDDM 还是 MCDM,也无论是 GPU、NPU 还是其他异构计算设备。
资源迁移的种类和目的
资源迁移是将虚拟化移动到新物理资源的功能。 移动虚拟化执行有多种方式,包括:
-
硬关机。 虚拟主板可直接断电,从而停止执行虚拟资源。 任何不具有电源容错的应用程序都会丢失正在运行的数据,并且所有设备状态都会被清除。 然后,虚拟硬盘 (VHD) 可以在不同的主机上虚拟化,从而实现冷启动。
-
软关机。 这种关机与硬关机不同,它只是向来宾 OS 发送关机请求。 然后,来宾 OS 将断电机制分配给应用程序,以便彻底关机。 应用程序可利用此通知安全地存储所有数据,并在启动时注册重启,但这取决于每个应用程序的编程。 软关机要求来宾 OS 支持这种完全关机机制,并支持适当的服务来存储当前状态并在重启时重新启动。
-
休眠。 另一种来宾启动技术允许来宾过渡到快速启动的睡眠电源状态,在这种状态下,所有应用进程都会被冻结,设备状态会被清除到 CPU 内存中,然后所有内存都会被发送到存储空间,以便让硬件关闭电源。 然后,可以在另一台机器上重新启动虚拟机存储 VHD,并加载内存、还原设备状态和解冻进程。 只有支持的来宾 OS 才能使用休眠功能。 这是一个相当具有侵入性的过程,依赖于客户机的稳定性,但它提供了一种机制来还原应用程序进程的状态,这是关机机制所不能提供的。
-
快速迁移(也称为 VM 保存和还原)。 利用这种技术,VM 会暂停(vCPU 停止调度),并在主机 OS 中收集还原新物理资源状态所需的所有状态,包括 VM 的内存和所有设备的状态。 然后,此状态会被传输到新主机,新主机会创建一个已加载所有 vCPU 上下文的 VM,将内存映射到 VM 空间并还原设备状态。 然后,PowerOnRestore 会重新启动 vCPU 的执行。 此技术独立于来宾 OS,不依赖于客户环境中的执行,因此是比休眠更可靠的保持进程和设备状态的方法。 虚拟化用户可能会注意到明显的停机时间,因为 VM 内存可能会有很多 GB,传输时间也会很明显。
-
实时迁移。 如果我们有能力在虚拟化资源仍处于活动状态的情况下传输内容,并且可以跟踪被弄脏的内容,那么就可以在保持虚拟化处于活动状态的情况下传输大量内容。 这样,当 VM 暂停时,需要传输的内容就会大大减少,我们就能最大限度地减少不执行虚拟化的时间。 这样做能够最大限度地减少对终端用户的影响,因为迁移过程中发生的所有操作都不会受到影响,对资源消耗率的影响也会尽可能地降低。 特别是,这样可以最大限度地减少或消除中断期限(虚拟化中断的外部时间限制,如外部端点的 TCP 和其他协议超时)。
每一个进展都会减少或消除客户对虚拟化物理分配变化的一些(通常是主要的)感知,从而让虚拟化对用户越来越完整和透明。 它与其他将客户对基础设施的依赖性分离出来的技术(如主机崩溃隔离)一起,它让我们的虚拟化解决方案朝着分配独立和真正的短暂计算的理想方向发展。
大规模设计
实时迁移会将虚拟化内容从源主机传输到目标主机。 虚拟化由各种有状态设备组成,包括内存、计算和存储设备,每个设备都有必须从源设备传输到目标设备的数据。 跨群集管理虚拟化的执行代理会与主机通信,让主机知道要为现有虚拟机的源迁移(当内容离开主机时)或向新虚拟机的目标迁移(接收内容)设置编排。 这种互动的主要参与者如下图所示。
源主机的时期
下图演示了源端迁移状态。
源端启动
一般情况下,当主机启动时,KMD 会通过各种初始化调用向内核报告设备能力。
当 KMD 收到 DXGKQAITYPE_GPUPCAPS 数据的 DxgkDdiQueryAdapterInfo 调用时,它可以设置添加到 DXGK_GPUPCAPS 的 LiveMigration 能力位。 当 KMD 设置该位时,它表示驱动程序支持实时迁移。
支持实时迁移的前提条件是支持跟踪所有 GPU 本地内存段上已修改的 VRAM 页面,如脏位跟踪中所述。 该支持通过其他指定信息类型的其他 DxgkDdiQueryAdapterInfo 调用进行报告。 报告支持实时迁移的驱动程序还必须报告支持脏位跟踪。 支持实时迁移但不支持脏位跟踪的配置无效,并且 Dxgkrnl 无法启动适配器。
VM 在线
一旦主机启动并且管理堆栈上线,虚拟机活动就会开始上线。 启动和停止 VM 的请求开始到达,我们开始看到 GPU-P vGPU 被投射到这些虚拟化中。
假定具备高性能脏位平面能力,Dxgkrnl 将在为 VF(虚拟函数)预留 VRAM 资源后调用 DxgkDdiStartDirtyTracking,这样将允许系统在 VF 稍后参与迁移的情况下跟踪 VRAM 的清洁度。
此 VM 启动后会开始拦截中断表访问以虚拟化中断支持,而这将在 VM 的整个生命周期内持续进行。
实时迁移发送准备
管理堆栈会根据控制指示发送开始实时迁移的事件,迁移状态机管理会从虚拟设备中收集虚拟化期间不可更改的所有状态(vGPU 分区配置指标),以便在目标上重建 vGPU。 准备就绪后,传输缓冲区的准备和传输栈的初始化过程就会开始。
此时期生成对引入的 DxgkDdiPrepareLiveMigration DDI 的调用。 KMD 应制定 PF/VF 调度策略,以便让实时迁移能够从主机的 VRAM 中流式传输脏内容,同时为 VF 保持公平的性能。 如果脏追踪被报告为不执行,则脏追踪也会从这一点开始。