外接 ASUS RTX 4060(OCuLink 显卡坞)在运行中会突然从 PCIe 总线消失,导致全屏黑;拔掉显卡坞的 DP 线把显示器改接核显后画面恢复,但外接卡要重启才会重新枚举。本文只记录外接卡自身这个问题(核显被连带打崩成 Code 43 是另一个独立问题,见文末关联)。
🔴 现象
- 外接卡可能开机后几分钟到十几分钟内任意时刻无前兆掉链,规律性不定
- 掉链后屏幕全黑(当时显示输出全在该卡上),显卡风扇仍在转
- 驱动自己给出的判词:
GPU is lost. Reboot the system to recover this GPU - 卡先变
CM_PROB_FAILED_POST_START(Code 43),随后从总线移除(CM_PROB_PHANTOM);硬件重扫扫不回来,必须重启 - 核显会被连带打崩成 Code 43,需要用
pnputil /restart-device单独救(见另一个笔记)
📅 死亡现场(精确到秒,2026-10-04 14:33 那次)
| 时刻 | 事件 |
|---|---|
| 14:22:45 | 开机后卡枚举成功(DEVPKEY_Device_LastArrivalDate) |
| 14:33:43.437 | 最后一条完全正常的遥测(50°C / 占用 11% / PCIe gen1 x4) |
| 14:33:44.485 | 死亡瞬间 —— 第一条 GPU is lost |
| 14:33:47.552 | 死亡后 3 秒,Win32k Id=263 开始刷屏 |
| 14:34:00.405 | 驱动正式报 GPU is lost. Reboot the system to recover this GPU |
| 14:34:27.364 | 最后一次能采到(之后彻底失联) |
| 14:34:31 | 卡从 PCIe 总线移除(DEVPKEY_Device_LastRemovalDate) |
| — | 转储文件 WATCHDOG-20261004-1433.dmp(1,236,451 字节) |
存活时长不定:同一天三次死亡,卡分别活了约 2 分钟、12 分 46 秒、更短 —— 不是固定倒计时,是随机间歇。
📊 临死前遥测(决定性负结果)
用 nvidia-smi 每秒轮询采到的临死前 2 分钟数据,全部正常,无任何前兆:
| 指标 | 临死前实测值 | 判读 |
|---|---|---|
| 温度 | 49 → 50°C 缓升,无尖峰 | 排除过热 |
| 核心 / 显存频率 | 210 MHz / 405 MHz(空闲档) | 无异常拉升 |
| GPU 占用 | 8 ~ 21% | 与负载无关 |
| 显存占用 | 865 ~ 877 MiB 平稳 | 无泄漏无暴涨 |
| 风扇转速 | 0% | 温度确实低 |
| PCIe 代数/宽度 | gen1 / x4 全程不变 | 无降级 |
| PCIe 重传计数 | 0 | 链路未报错 |
⇒ 卡是在「各项指标全部正常」的状态下,下一秒突然失去响应。这种无前兆的瞬间失联不是渐进劣化的形态。
✅ 已确认的硬件/软件环境事实
| 项 | 值 |
|---|---|
| 设备实例 | PCI\VEN_10DE&DEV_2882&SUBSYS_89361043&REV_A1\4&25C6DA53&0&0009 |
| 父节点 | PCIe 根端口 PCI\VEN_1022&DEV_14ED\3&11583659&0&09(根端口状态一直 OK) |
| 链路能力 | gen.max=4 / width.max=8;实测空闲降为 gen1 / x4(NVIDIA 正常省电行为,不是异常) |
| 连接方式 | 原生 PCIe 外接(OCuLink 类),不是 USB4 / 雷电隧道 |
| 驱动 | 595.79 / nv_dispsi.inf / oem17.inf,安装日期 2026-04-13 15:37 |
| 驱动包签名 | nv_dispsi.inf 与 NV_DISP.CAT 均为 Valid,签发者 CN=Microsoft Windows Hardware Compatibility Publisher |
| VBIOS | 95.07.31.80.02 |
| 功耗墙 | default 115 W / max 138 W(与公版 4060 TGP 一致,未见刷改痕迹) |
❌ 已排除的可能性(逐项实测,每行独立)
| 假设 | 实测证据 | 结论 |
|---|---|---|
| 过热 | 临死前 50°C、无坡度、风扇 0% | ❌ |
| GPU 负载压力 | 死亡时占用仅 8~21%,当时只开聊天软件与浏览器 | ❌ |
| 整机掉电 / 电源切换 | 死亡那一秒 Kernel-Power 无任何事件;今天的 105(电源切换)只出现在 11:07 / 11:08 | ❌ |
| PCIe 链路信号劣化 | 重传计数 0,gen/width 全程不变 | ❌ |
| 热降频 / 功耗墙 | HW/SW Slowdown 全部 Not Active,累计降频仅 0.65 秒 | ❌ |
| 驱动/补丁失效 | INF 与 CAT 签名 Valid,驱动版本未变;且故障形态是「卡从总线消失」,不是补丁能管的「驱动拒绝认卡」 | ❌ |
| 关闭 ReBAR 能解决 | 关掉后照样复发(关 ReBAR 只治好了另一症状:开机时微端口启动失败 0xC000009A) | ❌ |
| 某个应用/软件触发 | 死亡前后无 WER 报告、无 XID 错误、无应用错误(Application 日志) | ❌ |
Win32k 263 是原因 | 它在死亡之后 3 秒才出现(死亡 14:33:44.485,首条 263 在 14:33:47.552) | ❌(是后果) |
| 硬件重扫能找回卡 | pnputil /scan-devices 后仍为 CM_PROB_PHANTOM | ❌ |
✅ 死亡后的连锁反应(实测顺序)
| 步骤 | 证据 |
|---|---|
| 卡引擎瞬间失联 | nvidia-smi 报 GPU is lost;WATCHDOG 转储头解出 bugcheck 0x141 VIDEO_ENGINE_TIMEOUT_DETECTED(部分次为 0x117 TDR) |
| 桌面合成器死掉 | Dwminit:The Desktop Window Manager process has exited. (Process exit code: 0xe0464645, Restart count: 8, Primary display device ID: NVIDIA GeForce RTX 4060) |
| dwm.exe 连续崩溃 | Application Error Id=1000:崩溃进程 dwm.exe,异常码 0xe0464645,Faulting module: unknown / offset 0(不是访问违规,是被系统终结)—— 40 秒内连崩 8 次(每 5.5 秒一次) |
| 屏幕全黑 | DWM 的主显示设备就是那块死掉的卡,反复重启均失败 |
| 卡进入故障态 | CM_PROB_FAILED_POST_START(Code 43)→ CM_PROB_PHANTOM |
| 指针设备失去关联 | Win32k Id=263(A pointer device has no information about the monitor it is attached to.)刷屏;开机基线只有 Id=267,出现 263 即代表显示器关联断了 |
🔬 证据从哪里来(可复用的取证方法)
解 WATCHDOG 转储的 bugcheck(不需要 WinDbg)
LiveKernelReports 的 .dmp 是标准 DUMP_HEADER64,头部明文,用 Python struct 直接读:
import struct, glob, os
for f in sorted(glob.glob('C:/Windows/LiveKernelReports/WATCHDOG/*.dmp')):
d = open(f, 'rb').read()
bc = struct.unpack_from('<I', d, 0x38)[0] # BugCheckCode
p1,p2,p3,p4 = struct.unpack_from('<QQQQ', d, 0x40)
print(os.path.basename(f), hex(bc), [hex(x) for x in (p1,p2,p3,p4)])对照表:0x116 VIDEO_TDR_FAILURE、0x117 VIDEO_TDR_TIMEOUT_DETECTED、0x141 VIDEO_ENGINE_TIMEOUT_DETECTED。
查设备何时到位/何时消失(精确到秒)
Get-PnpDeviceProperty -InstanceId '<设备实例ID>' -KeyName DEVPKEY_Device_LastArrivalDate
Get-PnpDeviceProperty -InstanceId '<设备实例ID>' -KeyName DEVPKEY_Device_LastRemovalDate
Get-PnpDeviceProperty -InstanceId '<设备实例ID>' -KeyName DEVPKEY_Device_ProblemCode轮询遥测等它死(脚本已就绪)
egpu-trace.ps1(位于 Hermes profile 的 scratch 目录)每秒采一次 nvidia-smi 遥测,设备失联即停并保留最后一条好数据。要点:
- 用
nvidia-smi --query-gpu=... --format=csv,noheader,nounits轮询,不要用Get-PnpDeviceProperty轮询(CIM/WMI 极慢,实测单次 5~6 秒) - 字段名要从富到简降级验证:nvidia-smi 只要有一个字段名非法就整条查询失败,会被误判成「设备掉了」
- 失联判定不能只看退出码:设备丢失时 nvidia-smi 可能仍返回 0 并给出文本
Unable to determine the device handle ... GPU is lost,必须同时匹配该文本
🎯 剩余可能性与判决实验
「无前兆、与负载/温度/电源/链路全部无关、存活时长不定」—— 只剩三个候选:
| 编号 | 可能性 | 说明 |
|---|---|---|
| A | 卡本身间歇故障 | GPU 核心 / 显存 / 板载供电模块(VRM)间歇失效 |
| B | 显卡坞供电瞬时中断 | 坞子电源(PSU)老化、瞬态压降、接触不良 |
| C | OCuLink 链路瞬时失效 | 连接器接触面、坞子侧插座、M.2 转接板 |
实验一(判决性):把卡插到普通台式机 PCIe 槽
| 结果 | 结论 |
|---|---|
| 台式机上照样掉 | A:卡本身在坏 → 送修或换卡 |
| 台式机上稳如泰山 | B 或 C:问题在显卡坞侧 |
因为现在故障已高度可复现(十几分钟内必发),这个实验成本很低。
实验二(不用拆机):限制功耗/频率看存活时长变化
nvidia-smi -pl <降低的功耗上限>
nvidia-smi -lgc <核心频率上限>逻辑:若限制后存活时间显著变长甚至不再死 → 强烈指向供电侧问题(B 或 A 的 VRM);若照旧随机死 → 更像瞬时接触/电气事件(C)。可逆(重启即还原)。
实验三(优先级最低):隔离显示负载
不接显示器、只让卡挂着看是否照死。从今天数据看(占用仅 8~21%、温度 50°C)几乎可确定与显示负载无关。
📌 复发史
| 日期 | 记录到的事件 |
|---|---|
| 2025-04-20 | DxgKrnl-Admin 457(微端口启动设备失败) |
| 2026-03-26 | DxgKrnl-Admin 456 ×2 |
| 2026-03-30 | DxgKrnl-Admin 457 |
| 2026-04-13 | DxgKrnl-Admin 457 |
| 2026-10-04 | 共 7 个 WATCHDOG 转储:09:36 / 09:49 / 10:58 / 10:59 / 12:57 / 13:31 / 14:33(其中 14:33 那次采到了完整临死遥测) |
⚠️ 注意事项
- 不要把
/restart-device用在这块卡上。实测:对已经 Code 43 的外接卡执行pnputil /restart-device,结果是Code 43→Code 31 (CM_PROB_FAILED_ADD)→ 硬件重扫后CM_PROB_PHANTOM(直接掉出总线)。该命令只适合用在被连带打崩的核显上。 - 掉链后卡已经不在总线上,任何软件手段都救不回来(重扫不行),必须重启。
- OCuLink 不支持热插拔,插拔必须关机进行。
🔗 关联
本文只针对外接卡自身。核显被连带打崩成 Code 43 是另一个独立问题,见同目录下的《显卡:外接显卡掉链后核显报Code43的诊断与恢复》:
| 外接卡掉链(本文) | 核显 Code 43(另一篇) | |
|---|---|---|
| 性质 | 根因,尚未找到 | 外接卡死亡引发的连带后果 |
| 能否软件恢复 | 不能,必须重启 | 能,一条 pnputil /restart-device |