Skip to content

GPU 服务器故障诊断手册:XID 错误码、ECC 与换件决策 ​

一句话:GPU 报错时,绝大多数人做的第一件事是重启;正确做法是先把 XID 分成"应用错、驱动错、硬件错"三类,再决定是重启、排空、换件还是报修。判错的代价是双向的——把应用 bug 当硬件换掉一张卡,和把退化中的 HBM 当成软件问题反复重启,都很贵。

本文只讲一件事:从报错现象走到可执行结论。所有结论都能落到三句话之一——重启该应用、重置该 GPU、发起 RMA。

一、XID 是什么:驱动写给内核的判据,不是硬件判决书 ​

XID 是 NVIDIA 驱动在检测到 GPU 异常后写入内核日志(/var/log/messages 或 syslog)的错误报告,格式固定:

NVRM: GPU at 0000:03:00: GPU-b850f46d-d5ea-c752-ddf3-c4453e44d3f7
NVRM: Xid (0000:03:00): 48, pid=7062, ...

前一行的 GUID 与 PCI 地址把后面所有 Xid 归到同一张卡,这是排查的入口:先按 PCI 地址聚合,再看同一张卡上的 Xid 序列。

NVIDIA 自己的定义很克制:Xid 消息"最常由驱动错误地编程 GPU,或发送给 GPU 的命令被破坏引起",可能指向硬件、NVIDIA 软件或用户应用三类问题。换句话说,XID 编号是分类起点,不是结论。同一张卡上 FB(frame buffer)或 PCIe 的数据损坏,理论上能伪造出几乎任何一条 Xid。

所以判读必须先分流,再落结论。

二、第一步:三个问题快速分流 ​

拿到报警别急着重启,先回答三个问题:

问题判读含义
只有这一个进程崩,还是同卡所有进程都崩?只崩一个 → 优先怀疑应用;同卡全崩 → 驱动或硬件
是复现型(同样作业必现),还是随机型(换作业也偶发)?复现型 → 应用或特定 kernel;随机型 → 硬件或链路
换一张卡跑同样作业是否消失?消失 → 硬件定位成功;迁移后复现 → 应用或框架

三个问题问完,90% 的工单已经能定性。剩下的 10% 才是真正需要读错误码的部分。

三、高频 XID 分组判读 ​

下表只收录机房现场真正常见的一批,按"根因归属"分组,比按编号顺序背更有效。

3.1 应用类:先怀疑代码,别动硬件 ​

XID官方含义判读要点
13Graphics Engine Exception典型是越界访问(走出数组末尾),也可能是非法指令、非法寄存器。用 Compute Sanitizer memcheck 或 CUDA-GDB 能直接指出出问题的那行代码
31GPU memory page fault(FIFO: MMU Error)MMU 报非法地址访问,绝大多数是应用层 bug,少数是驱动或硬件
43Reset Channel Verif Error应用触发软件故障被终止,GPU 本身仍健康,官方明确"通常不是驱动 bug,而是用户应用错误"
45Preemptive Channel Removal应用被 Ctrl-C、kill 或 GPU 复位拆掉时的伴随信息,通常无需动作。A100 上若单独出现,要查 Fabric Manager 是否与 GPU 同机运行并异常退出

这一组的关键判断是"GPU 是否仍健康"。43 和 45 明确不算硬件问题;13 和 31 要先用工具证明是应用错——证明不了,才进硬件流程。

3.2 显存类:XID 48 / 63 / 64 / 92 / 94 / 95 / 140 ​

这是最容易误判、也最需要看数字的一族。判读依赖三个前提概念:

  • SBE(single-bit error):单比特错,ECC 可纠正,不致命,但位置重复出现会触发页退役或行重映射;
  • DBE(double-bit error):双比特错,不可纠正,Xid 48 就是它;
  • contained / uncontained:A100 起引入错误隔离,把不可纠正错误限制在出错的那个应用内(94),还是影响整卡所有应用(95)。
XID含义该做什么
48Double Bit ECC Error若后面跟着 63 或 64:排空节点、等作业结束、重置 GPU。若没有跟 63/64:跑现场诊断收集更多信息,并按阈值评估是否 RMA
63行重映射/页退役记录成功若与 48 同时出现 → 排空、重置;若单独出现(来自 SBE)→ 可继续跑,等到方便时重启
64行重映射/页退役记录失败记录失败是硬信号:A100 起立即重启节点;legacy 卡立即重置该 GPU。持续出现则排空、报修
92High single-bit ECC error rate单比特错误率过高,跑现场诊断,按错误率趋势与阈值决定是否 RMA
94Contained ECC error只需重启出错的那个应用,其他应用不受影响;方便时再重置 GPU 让重映射生效
95Uncontained ECC error不可纠正且未被隔离:MIG 开着就先排空其他实例再重置;MIG 关着则立即重启节点
140ECC Unrecovered Error驱动连"把页标记为不可用 / 重映射"都做不到了。重置 GPU,仍复现就联系厂商
171 / 17248 的细化:DRAM 错 / SRAM 错决定后续走显存 RMA 还是 SRAM RMA,判据不同(见第五节)

一句话记住优先级:94 只坑自己,95 坑全卡,64 是记录失败必须马上动,140 是连补救都失败。

3.3 链路与总线类:74 / 79 / 32 / 110 ​

XID含义判读要点
74NVLink Error链路本身故障,也可能是对端设备故障导致这条链路掉了——一张卡坏了,和它相连的卡也会报 74。必须用 DWORD 解码(见第四节)
79GPU has fallen off the bus驱动通过 PCIe 访问 GPU 时发现设备不见了。常见原因是 PCIe 链路硬件故障导致链路 down。先查系统事件日志与内核 PCIe 事件,再排空报修
32PBDMA Error驱动与 GPU 之间经 PCIe 的通信流由 DMA 控制器管理,报错主要涉及 PCI 链路质量问题,官方明确指出"一般不是用户应用引起的"
110Security fault error除非硬件故障,否则不该出现。先回退最近的硬件改动并冷启动,不行就联系厂商

这组里 74 和 79 是最需要现场纪律的:79 一旦出现,这张卡基本进入换件流程;74 则要先把对端一起查,否则容易换错卡。

3.4 平台类:61 / 62 / 119 / 120 / 121 ​

XID含义动作
61PMU Breakpoint上报问题并重置 GPU
62PMU Halt(微控制器停机)上报问题并重置 GPU
119 / 120GSP RPC Timeout / GSP Error先重置 GPU,不行则整机断电冷启;冷启后仍复现,按 GPU 调试指南继续收集
121C2C Link corrected error(Grace 平台)已由系统纠正,无运行影响;在维护窗口重置 GPU 重新训练链路即可

61/62/119/120 共同特征是"GPU 内部协处理器失联",软件侧能做的只有重置与冷启,重复出现即为硬件信号。

Xid 74 的日志尾部带一串十六进制 DWORD,形如 (0x12345678, ...)。取第一个 DWORD(加粗那个),从最低位(LSB)开始数位:

置位含义现场动作
bit 4 或 bit 5很可能是 ECC/Parity 的硬件问题同一链路出现 2 次以上即报修
bit 21 或 bit 22通道信号完整性(SI)临界先查机械连接、重插线缆/重上板
bit 8、9、12、16、17、24、28可能是硬件问题检查机械连接并重插;仍复现则跑诊断

这套位判读的价值在于:它能区分"该重插"和"该换件"。不分位、只看"74 出现几次",运维会陷入反复重插的循环。

配合 nvidia-smi nvlink -e 看每条链路的 CRC/replay 计数,能进一步确认是持续性退化还是单次事件。

五、ECC 阈值:什么时候真的该换卡 ​

这一节是本文最该被收藏的部分,因为"该不该换"不该靠感觉。

5.1 行重映射的三条失败判据(A100 / H100 起) ​

行重映射把退化单元换成 HBM 里的备用行,全卡最多 512 次重映射。出现以下任一情况即置位 row-remapping failure flag:

  1. 某个 bank 已重映射 8 行不可纠正错误,还要再映射第 9 行;
  2. 对已经重映射过的行再次尝试映射(这可能发生在同一 bank 内远少于 8 次的时候);
  3. 不可纠正错误的重映射累计达到 512 次。

失败标志置位、并经现场诊断工具(Field Diagnostic)验证后,即满足 RMA 条件。

5.2 SRAM(L2)的 RMA 判据 ​

SRAM 结构靠 ECC 或 parity 保护,密度高,本底辐射造成的偶发不可纠正错属正常现象,单次不能作为换件依据。判据按保护方式分:

  • parity 保护的 SRAM:同一地址 bank 内 UCE 唯一计数 > 4;
  • SECDED ECC 保护的 SRAM:同一地址 bank 内 UCE 唯一计数 > 2。

5.3 页退役(Volta 及更早一代)的判据 ​

老卡走动态页退役,全卡上限 64 页(每页 64 KiB):

  • 60 页即具备 RMA 资格;
  • 64 页会在 Field Diagnostic 中直接判失败;
  • 特例:已退役 15 页以上,且仍以每周 ≥1 页的速度新增时,可以在未到 60 页前申请评估。

5.4 读数字的三个命令 ​

bash
# 显存错误与行重映射状态(看 Remapped Rows / Pending / Failure)
nvidia-smi -q -d ECC,PAGE_RETIREMENT,ROW_REMAPPER

# 单卡精简版:只看是否 pending / failure
nvidia-smi --query-gpu=index,pci.bus_id,ecc.errors.uncorrected.volatile.total,retired_pages.pending,remapped_rows.pending,remapped_rows.failure --format=csv

关键区别要记牢:remapped_rows 记录的是写入 InfoROM 的条目数,不是硬件里已经完成的映射数;映射要等 GPU 重置才真正生效。所以看到 pending 不等于已经修好,看到计数不为 0 也不等于已经坏透。

六、换件判定矩阵 ​

把前面的判据压成一张可以贴在工位上的表:

证据组合结论动作
仅 13/31,且 memcheck 能定位到具体代码行应用 bug交给用户改代码;不动硬件
43/45 单独出现,GPU 健康检查通过应用终止的正常伴随信息记录后关闭工单
48 →(63 或 64)发生不可纠正显存错,且已记录排空、等作业结束、重置 GPU;继续观察
64 反复出现(记录失败)InfoROM 写入侧失效立即重启/重置;持续则 RMA
94隔离成功只重启该应用;维护窗口重置
95隔离失败立即排空并重启节点;记录 RMA 证据
140连重映射都失败重置;复现即 RMA
row-remapping failure flag = true(8 行/重复行/512 次)达到显存 RMA 判据跑 Field Diagnostic,发起 RMA
SRAM UCE 超阈值(parity > 4 或 SECDED > 2)达到 SRAM RMA 判据同上
74 且第一个 DWORD bit4/5 置位、同链路 ≥2 次NVLink 硬件退化报修,勿反复重插
74 且 bit21/22 置位信号完整性临界检查机械连接、重插
79GPU 掉总线排空 + 收集 PCIe AER 日志 + RMA
92 且单比特错误率持续上升HBM 退化趋势现场诊断 + 按趋势申请评估
61/62/119/120 重置后反复协处理器故障冷启一次;仍复现则 RMA
121(Grace C2C)已纠正,无影响维护窗口重置链路

七、证据采集:一次抓全,别让厂商来回要日志 ​

报修被退回最常见的原因是证据不全。下面这段可以一次跑完并打包:

bash
#!/usr/bin/env bash
OUT=/tmp/gpu-evidence-$(hostname)-$(date +%F-%H%M)
mkdir -p "$OUT"

# 1. XID 时序(按卡聚合,先看序列再看单条)
grep -h "NVRM: Xid" /var/log/messages* 2>/dev/null | tail -n 200 > "$OUT/xid.log"
grep -h "NVRM: GPU at" /var/log/messages* 2>/dev/null | tail -n 50 > "$OUT/gpu-map.log"

# 2. 显存与重映射状态
nvidia-smi -q -d ECC,PAGE_RETIREMENT,ROW_REMAPPER > "$OUT/ecc-rowremap.txt"
nvidia-smi -q > "$OUT/nvidia-smi-full.txt"
nvidia-smi -q -d TEMPERATURE,POWER,CLOCK,PERFORMANCE > "$OUT/thermal-power.txt"

# 3. PCIe 链路与 AER(掉总线/降速的关键证据)
lspci -vvv 2>/dev/null | grep -A3 -i "nvidia\|3d controller" > "$OUT/lspci.txt"
dmesg | grep -iE "pcie|aer|link.*down|corrected|fatal" | tail -n 200 > "$OUT/pcie-aer.log"

# 4. NVLink 计数
nvidia-smi nvlink -s > "$OUT/nvlink-status.txt" 2>/dev/null
nvidia-smi nvlink -e > "$OUT/nvlink-errors.txt" 2>/dev/null
nvidia-smi nvlink -c > "$OUT/nvlink-capabilities.txt" 2>/dev/null

# 5. 主动诊断(短测,几秒到一分钟)
dcgmi diag -r 1 > "$OUT/dcgm-diag-short.txt" 2>&1

# 6. 官方打包(含内核日志与驱动内部状态)
nvidia-bug-report.sh --output-file "$OUT/nvidia-bug-report.log.gz"

tar czf "$OUT.tar.gz" -C /tmp "$(basename $OUT)"
echo "collected: $OUT.tar.gz"

采集纪律三条:

  1. 先存证,再重置。重置会清掉 volatile 计数,先抓日志;
  2. 带上时序。单条 Xid 没有意义,tail -n 200 里的先后顺序才有;
  3. 短测用 -r 1,长测用 -r 3。dcgmi diag -r 1 几秒到一分钟适合做作业前预检;-r 3 约 30 分钟,用于送修前完整验证。

八、换件后的复验:不做这一步,等于没修 ​

换卡/换线/换交换机端口之后,必须留下"修好了"的证据,否则同类问题下次会以另一种形态回来。

  1. 节点健康:dcgmi diag -r 2 全绿,XID 清零;
  2. 显存干净:nvidia-smi -q -d ECC,ROW_REMAPPER 中 DBE/volatile 归零、pending 为 false;
  3. 链路速率达标:nvidia-smi nvlink -s 显示每链路预期速率(Hopper 400 GB/s 级),PCIe 侧 lspci -vvv 的 LnkSta 为预期宽度与速率(如 x16 / 32GT/s),不是降级后的 x8;
  4. 集合通信回到基线:用现有 NCCL 基线(如 all_reduce_perf busbw)对比换件前后,差值应在噪声范围内;
  5. 记录归档:卡 SN、槽位、XID 序列、复验数据一并入库,这是下次 20 秒定位同类问题的资产。

九、三个高频误判 ​

  1. 把 43/45 当硬件故障。它们明确是"应用被终止"的伴随信息,尤其 45 在 A100 上还可能只是 Fabric Manager 同机异常退出。按硬件换件,等于白换。
  2. 把 94 当 95。94 只需重启应用,95 要重启节点。判反了,要么造成不必要的整机重启,要么让污染扩散到全卡作业。
  3. 只看 XID 不看对端。74 的一多半误换件来自"没查对端"。一张 GPU 掉链路,和它相连的 GPU 与 NVSwitch 都会报错,谁是真凶要靠 DWORD 位和 nvlink -e 计数判断。

收口三句 ​

  • 先分流,再读码:三个问题(范围、复现性、换卡是否消失)就问掉了大部分工单;
  • 显存看数字,链路看位:ECC 靠行重映射/页退役阈值下结论,NVLink 靠 DWORD 位区分重插与换件;
  • 先存证再重置:证据集不全的报修,一定会被退回来重跑一遍。

AI-HPC 智算超算专家 · Contact: openaihpc@gmail.com