版本信息最后核对:2026-10-25
GPU Xid 错误:从内核日志定位到硬件复检的排障路径。
训练或推理进程突然退出、卡住,容器反复重启;dmesg 或 journalctl -k 出现 NVRM: Xid 日志;严重时 nvidia-smi 里少了某张卡,或者整机 GPU 查询直接失败。典型日志形态如下:
NVRM: Xid (PCI:0000:3b:00): <编号>, pid=<PID>, name=<进程名>
Xid 是 NVIDIA 驱动检测到 GPU 异常时打印的错误码,它表示“症状”,而不是根因。同一个 Xid 可能来自应用非法访存、驱动与内核不匹配、显存或 NVLink 硬件故障,也可能只是散热和供电问题。不同编号的含义与处置建议会随 GPU 架构和驱动版本变化,必须查 NVIDIA 官方 Xid 文档与 Catalog,本文不逐号解释。
监控侧通常先在 DCGM_FI_DEV_XID_ERRORS 指标、系统日志或 nvidia-smi -q 的健康字段里发现异常。单次 Xid 不一定致命,但同一张卡重复出现、伴随 ECC 计数增长或掉卡时,应按硬件故障处理。
先取现场,不要急着重启:
# 最近的内核日志,定位 PCI 地址、PID 和编号
dmesg -T | grep -i -E 'NVRM|Xid'
journalctl -k --since '24 hours ago' | grep -i -E 'NVRM|Xid'
# GPU 是否还在、ECC 与 Xid 线索
nvidia-smi -L
nvidia-smi -q -d ECC,PAGE_RETIREMENT,ROW_REMAPPER
nvidia-smi -q | grep -i -E 'xid|ecc|remapped|retired|pending'
第一条命令先看三件事:出错的 PCI 地址对应哪张卡、进程 PID 是谁、错误是否在重复。然后回答四个问题:
nvidia-smi -L 少卡、lspci 看不到设备,属于掉卡级别,直接按硬件故障走。按下表先做粗分类,再进入排查步骤:
| 线索 | 更可能的方向 |
|---|---|
| 同一进程、同一算子稳定复现,换卡也复现 | 应用或框架 |
| 升级内核、驱动或容器运行时后集中出现 | 驱动/内核/容器 |
| 单卡反复报错,ECC 或 remap 计数增长 | GPU 硬件或显存 |
| 多卡同时报错,NVLink/Fabric 状态异常 | NVLink、NVSwitch、Fabric Manager |
| 高负载、高温或功耗触顶时出现 | 散热、供电、功耗墙 |
按概率从高到低,常见有五类。
越界访存、非法指针、kernel 启动参数错误、使用了与当前 GPU 架构不匹配的编译产物,都会触发驱动侧异常。自定义 CUDA/Triton 算子、量化 kernel、第三方加速库是重灾区。此类问题通常与特定输入强相关,换一张卡、换一个进程仍能复现。
内核升级后 NVIDIA 内核模块没有同步重建、驱动安装不完整、容器内用户态库与宿主机驱动版本不一致、nvidia-container-toolkit 配置错误,都可能让 GPU 在初始化或运行中报错。多卡机型还要检查 Fabric Manager 是否在驱动加载后正常启动,版本是否与驱动匹配。
显存颗粒故障、GPU 掉卡、PCIe 链路错误或降速、供电不足、散热不良都会以 Xid 形式暴露。ECC 可纠正错误持续增长、Row Remapper 触发、Retired Pages 增加,都是需要下线复检的信号。
多卡训练中 NVLink 链路错误、NVSwitch 或 Fabric Manager 异常,可能表现为通信报错后伴随 Xid。此时只看单卡状态不够,要同时查 nvidia-smi nvlink -e、Fabric 状态和相关服务日志。
超频、功耗墙设置、风扇策略、MIG 切分、IOMMU 与 P2P 配置、共享 GPU 的显存争抢,都可能让原本正常的卡进入异常状态。这类问题往往在变更后出现,回滚变更即可验证。
在重启前收集:
sudo nvidia-bug-report.sh
nvidia-smi -q > /tmp/nvidia-smi-q.txt
dmesg -T > /tmp/dmesg.txt
journalctl -k --since '24 hours ago' > /tmp/kernel-xid.txt
nvidia-smi --query-gpu=index,pci.bus_id,name,memory.used,temperature.gpu,power.draw \
--format=csv > /tmp/gpu-snapshot.csv
nvidia-bug-report.sh 会打包驱动、拓扑、日志和配置,是提交 NVIDIA 支持或内部复检的标准材料。若机器还能登录,先保留现场再决定是否重启。
nvidia-smi -L
lspci -nn | grep -i nvidia
nvidia-smi 少卡但 lspci 仍在,可能是驱动状态异常;两者都看不到,优先怀疑 PCIe 链路、供电或硬件。掉卡场景不要反复热重启,按厂商流程冷启动并复检。
compute-sanitizer,定位越界访存和非法访问:compute-sanitizer --tool memcheck python train_step.py
CUDA_LAUNCH_BLOCKING=1 让报错定位到具体 kernel,但它会显著拖慢训练,只用于定位。nvidia-smi -q -d ECC
nvidia-smi -q -d PAGE_RETIREMENT
nvidia-smi -q -d ROW_REMAPPER
nvidia-smi nvlink -s
nvidia-smi nvlink -e
nvidia-smi -q -d TEMPERATURE,POWER,PERFORMANCE
关注三点:ECC 计数是易失计数还是累计计数、复检前后是否继续增长;是否有 retired page 或 row remap;NVLink 错误计数在空闲时是否仍增长。温度长期贴近上限、功耗频繁触顶,也要纳入硬件排查。
nvidia-smi --query-gpu=driver_version --format=csv,noheader
cat /proc/driver/nvidia/version
systemctl status nvidia-fabricmanager
journalctl -u nvidia-fabricmanager --since '24 hours ago'
nvidia-smi -q | grep -i -A5 fabric
在带 NVSwitch 的机器上,Fabric Manager 未运行或版本不匹配会导致 NVLink 初始化异常,进而出现训练报错和 Xid。驱动、CUDA、Fabric Manager、容器工具链要按兼容矩阵成套升级,不要只动其中一个。
把可疑卡从调度中摘除,单独做健康检查:
CUDA_VISIBLE_DEVICES=<index> gpu_burn 1800
dcgmi diag -r 3
gpu_burn 用来观察高负载下的温度和降频,dcgmi diag 覆盖更完整的硬件自检。压测通过不代表问题一定在应用:还要用原业务负载复跑,因为只有真实显存访问模式才能复现某些错误。
拿到 Xid 编号后,查 NVIDIA Xid Errors 文档和 Xid Catalog,确认该编号对应的建议动作。不同架构、不同驱动版本对同一编号的解释可能不同,不要在团队内凭记忆口口相传。文档建议送修的,不要靠重启和降频硬撑。
按定位结果分别处理。
compute-sanitizer 加入 CI 的 GPU 冒烟测试;升级已知有问题的框架或算子库,并在相同输入上回归。dcgmi diag、gpu_burn 和业务回归。nvidia-smi nvlink -e;链路错误仍增长则检查线缆、背板和 NVSwitch。验证至少覆盖四层:
nvidia-smi -L 能识别全部 GPU,空载和压测后 dmesg 都没有新的 Xid。nccl-tests,busbw 与故障前基线一致。只有四层都通过,才把节点重新加入调度。仅“重启后能起来”不构成修复验证。
DCGM_FI_DEV_XID_ERRORS,同时监控 ECC、温度、功耗和 NVLink 错误,按卡设置告警而不是只看集群总量。dcgmi diag、gpu_burn 和 nccl-tests,通过后再打上可调度标签。nvidia-bug-report.sh、内核日志和 DCGM 指标纳入自动化采集,避免重启后证据丢失。合上页面,先回答,再展开对照。
nvidia-smi -q、ECC、NVLink 计数、dmesg 和 nvidia-bug-report.sh 的输出。重启会清空易失计数和现场,导致无法判断是应用、驱动还是硬件问题。nccl-tests 的 busbw 回到基线,原业务负载完整跑通一个周期。仅能开机不算修复。
小程序版
微信扫码,随时查命令