GPU D3cold 电源状态:如何在不经意间把显卡变砖
Source: Dev.to
症状
我的 NVIDIA Tesla P40 在一次虚拟机关闭后停止响应。没有显示错误信息;GPU 一直处于死机状态,直到主机完全重启后才恢复。
预期行为
对使用 GPU 直通的虚拟机进行干净的关闭后,GPU 应该保持在就绪状态。主机应能够优雅地处理电源状态的转换。
实际发生的情况
GPU 进入了 D3cold,一种低功耗状态,除非完整重启主机否则无法退出。即使在正确关闭虚拟机后也会出现,尤其在 Proxmox 8.4(内核 6.8.x)和 QEMU 8.0.1 环境下更为常见,因为 P40 缺乏 FLR(功能级复位)支持,导致主机无法对 GPU 进行复位。
修复方法
-
在直通设备之前禁用 D3cold:
echo 0 > /sys/bus/pci/devices/0000:08:00.0/d3cold_allowed -
使用 udev 规则固定 GPU 的 PCI 地址,确保重启后仍在同一总线上:
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{device}=="0x1b80", ATTR{bus}=="0000:08", SYMLINK+="gpu-passthrough" -
对于 Proxmox 8.4 用户,在虚拟机配置中 显式设置机器类型 以避免 QEMU 断言错误:
-machine q35
这些步骤可以让 GPU 保持在同一 PCIe 总线上,防止其进入 D3cold 陷阱。
为什么重要
在 Proxmox 8.4 及更高版本上,像 P40(以及类似的 T4)这类不支持 FLR 的 GPU 容易出现此问题。如果不禁用 D3cold 并固定 PCI 地址,GPU 可能会永久失去响应,等同于“砖头”,只能通过电源循环恢复。
该问题并非 Proxmox 独有。任何缺少 GPU FLR 支持且依赖内核管理电源状态的系统都有风险。类似症状也在特定条件下的 AMD GPU 上观察到,尽管对应的缓解措施不同。
其他考虑
-
在主机上运行 NVIDIA 驱动(而不是直通)可以提供更稳定的环境,避免 PCIe 总线不稳定和电源状态问题。NVIDIA Container Toolkit 在生产环境中使用效果良好。
-
对于在 Kubernetes 或其他编排平台上运行依赖 GPU 直通的 AI 工作负载,确保 GPU 永不进入不可恢复的电源状态对于避免整机重启至关重要。
结论
在使用不支持 FLR 的 GPU 进行直通时,禁用 D3cold 并固定 GPU 的 PCI 地址是必不可少的步骤。实施这些修复可以防止 GPU 在虚拟机关闭或重启后变得无响应。