主机:(4×RTX 4090,WDDM 模式)
驱动版本:576.52,CUDA 12.9
异常症状识别
正常满载的 RTX 4090 应表现为:功耗 200–400W、温度 60–80°C、性能状态 P0。当 GPU 利用率很高但功耗/温度异常低时,需警惕 GPU 已陷入 TDR 崩溃-恢复循环(Timeout Detection & Recovery)。
对比表
| 指标 | 正常满载 | GPU 1 异常表现 | 根因 |
|---|---|---|---|
| GPU 利用率 | 80–100% | 100% | 驱动报告计算单元"忙碌",实际在崩溃循环中 |
| FB 内存带宽利用率 | >50% | 0% | 显存控制器未做有效读写 |
| 功耗 | 200–400W | 99W(TDP 450W) | 硬件层面无事可做 |
| 温度 | 60–80°C | 39°C | 无真实热负载 |
| 性能状态 | P0 | P2 | 被降级,非最高性能态 |
| 温度限制寄存器 | 正值 | -7 / -2 / 0°C | 传感器读数被崩溃损坏 |
| PCIe 吞吐 | 视负载而定 | Tx 1.3 GB/s, Rx 1.2 GB/s | 大量无效数据搬运 |
确认诊断:查看 Windows 事件日志
wevtutil qe System /c:20 /rd:true /f:text /q:"*[System[Provider[@Name='nvlddmkm']]]"
关键事件 ID
| 事件 ID | 含义 | 指示 |
|---|---|---|
| 153 | GPU 停止响应,触发 TDR 恢复 | 密集爆发(本案例 15:36–15:37 共 18 次)→ 确认崩溃循环 |
| 13 | 图形异常 / 驱动检测到故障 | 崩溃后的残留错误 |
单 GPU 复位(无需重启整机)
原理
通过 Windows PnP(即插即用)接口禁用再启用目标 GPU 的物理设备,触发驱动重新初始化该 GPU,清空 CUDA context、复位传感器、恢复时钟。
步骤
1. 确认 GPU 未连接显示器
nvidia-smi -q -i 1 | findstr "Display"
输出应为:
Display Attached : No
Display Active : Disabled
若 Display Attached = Yes,禁用设备可能导致屏幕黑屏,应先将屏幕转移到其它显卡。
2. 获取 GPU 的 PCI 总线编号
nvidia-smi --query-gpu=index,pci.bus_id --format=csv,noheader
示例输出:
0, 00000000:34:00.0
1, 00000000:36:00.0 ← GPU 1,总线 0x36 = 54 (十进制)
2, 00000000:9C:00.0
3, 00000000:9E:00.0
3. 匹配 PnP InstanceId
powershell -Command "
$devs = Get-PnpDevice -Class 'Display' -Status OK,Unknown |
Where-Object { $_.FriendlyName -like '*NVIDIA*' }
foreach ($d in $devs) {
$prop = Get-PnpDeviceProperty -InstanceId $d.InstanceId `
-KeyName 'DEVPKEY_Device_LocationInfo' -ErrorAction SilentlyContinue
Write-Host ('{0} | {1} | {2}' -f $d.Status, $d.InstanceId, $prop.Data)
}"
找到对应 PCI 总线的 InstanceId。例如 GPU 1(总线 54):
OK | PCI\VEN_10DE&DEV_2684&SUBSYS_16F310DE&REV_A1\6&2295E862&0&00180010 | PCI bus 54, device 0, function 0
4. 禁用设备
powershell -Command "
Disable-PnpDevice -InstanceId '<InstanceId>' -Confirm:`$false
"
5. 等待 3 秒,重新启用
powershell -Command "
Start-Sleep -Seconds 3
Enable-PnpDevice -InstanceId '<InstanceId>' -Confirm:`$false
"
6. 验证复位结果
nvidia-smi -i 1
预期结果:
- 利用率 → 0%
- 显存 → ~25 MiB(仅 DWM 占用)
- 功耗 → 待机水平(~64W)
- 性能状态 → P0 或 P8
- 无残留计算进程
完整脚本
将以上步骤整合为单条命令(将 <InstanceId> 替换为实际值):
powershell -Command "
`$id = '<InstanceId>'
Disable-PnpDevice -InstanceId `$id -Confirm:`$false
Start-Sleep -Seconds 3
Enable-PnpDevice -InstanceId `$id -Confirm:`$false
Write-Host 'GPU reset complete. Verify with: nvidia-smi -i <index>'
"
注意事项
- 仅限 Display Attached = No 的 GPU。若 GPU 连接显示器,禁用将导致黑屏。
- 复位会断开该 GPU 上所有 CUDA context,正在运行的计算任务将丢失。