Skip to main content

前言​

NVIDIA GPU Xid 错误与处理建议:防误杀与防黑洞、底层机制、错误遏制、警告级与严重级 Xid 分级及自动化闭环

在大模型训练与高并发推理集群中,任务中断时最核心的排障问题是:究竟是业务代码存在越界与指针Bug,还是底层物理显卡发生了硬件损坏?

  • 过度反应(误杀好卡):将业务代码越界或硬件已自愈的轻微事件当作硬件损坏,盲目封禁节点(Cordon/Taint)或重启服务器,导致同机健康任务被中断。
  • 响应不足(算力黑洞):当GPU发生不可纠正的显存损坏、NVLink断链或PCIe掉卡时未及时屏蔽。由于坏卡上的任务会立即报错退出并释放资源,调度器会误判该卡“空闲”并持续把新作业调度上去,短时间内吞噬大量任务。

Xid(Xid Error Messages)是NVIDIA内核驱动(NVRM)在检测到硬件、固件或应用异常时向系统内核日志打印的标准诊断代码,同一Xid编号在不同驱动版本中含义保持一致。通过以下命令即可在宿主机检索Xid日志:

# 查看带时间戳的内核 Xid 日志(含 GPU PCI 地址与 UUID 映射前导行)
sudo dmesg -T | grep -iE "NVRM: GPU at|NVRM: Xid"

典型日志结构如下:

[Thu Oct 29 14:22:05 2026] NVRM: GPU at PCI:0000:65:00: GPU-1f027ee8-6e1e-2b8c-0108-3d370e5f0418
[Thu Oct 29 14:22:05 2026] NVRM: Xid (PCI:0000:65:00): 94, pid=7062, name=python3, Contained: CE User Channel (0x9). RST: No, D-RST: No

其中PCI:0000:65:00为物理插槽总线地址,GPU-1f027ee8-...为跨重启不变的显卡UUID,冒号后的94即为Xid编号,pid标识触发进程,RST: Yes/No与D-RST: Yes/No指示是否需要立即重置GPU或排空作业后重置。若需向厂商报修,可执行sudo nvidia-bug-report.sh(掉卡卡死时加--safe-mode --extra-system-data)收集诊断包。

NVIDIA官方Xid手册地址:https://docs.nvidia.com/deploy/xid-errors/index.html

核心前置概念速览​

在查阅具体Xid编号前,先理解以下几个高频出现的硬件与驱动底层概念,有助于明白各个Xid的触发原理与恢复要求:

核心概念通俗类比技术原理与关联Xid
Channel与GR引擎业务窗口与计算车间驱动为每个GPU上下文分配独立的硬件通道(Channel),将算子交由GR计算引擎(含SM流式多处理器)执行。代码算子越界会报Xid 13;进程崩溃导致通道被驱动强制回收会报Xid 43。
MMU(内存管理单元)显存地址翻译官负责将程序中的虚拟显存地址翻译为HBM物理显存地址。若程序访问空指针、越界地址或已释放显存,MMU会触发缺页异常(Xid 31,相当于CPU的段错误SIGSEGV)。
ECC(SBE与DBE)显存纠错码单比特翻转(SBE) 由硬件自动纠错,业务无感;双比特或多比特翻转(DBE) 硬件无法自动修复,称为不可纠正错误(UCE),会触发Xid 48、94或95。
InfoROM板载非易失病历本GPU板卡上的持久只读存储器,断电不丢失,用于存储设备UUID、历史ECC统计及显存坏块隔离记录。
页面退役与行重映射显存坏块隔离机制V100及更早架构采用动态页面退役(Page Retirement)(软件层屏蔽坏页,上限64页);A100/H100/B100等采用硬件行重映射(Row Remapping)(每个显存Bank预留硬件备用行,在GPU Reset时透明替换坏行,整卡上限512行)。记录写入InfoROM成功报Xid 63,写入失败或备用行耗尽报Xid 64。
动态页面下线在线实时软隔离Ampere(A100)起引入。发生显存错误时,驱动立即在软件层将坏页标记为不可用(Dynamic Page Offlining),无需立刻重置GPU,新老任务均不会再分配到该坏页。
错误遏制机制故障防扩散隔离舱Ampere(A100)起引入(Error Containment)。当发生不可纠正ECC错误时,若硬件成功将损坏限制在触发错误的单个进程内,报受控错误Xid 94(同卡其他任务不受影响);若错误扩散至共享缓存/全局结构无法隔离,则报非受控错误Xid 95(必须重置整张GPU)。

从Ampere架构开始,显存发生不可纠正ECC错误时的硬件自愈与Xid触发关系如下:

常见Xid分级总览与处置决策​

围绕生产环境中最常见的11个Xid代码,我们根据“故障是否破坏GPU全局可用性”将其划分为两大阵营:

  • 警告类Xid(通常无需屏蔽GPU卡):13、31、43、63、94。此类错误源于用户代码缺陷(13、31、43),或硬件已完成在线坏块隔离与记录(63、94),GPU依然具备正常服务能力,切忌盲目封卡。
  • 严重错误类Xid(必须立即屏蔽GPU卡):48、64、74、79、95、154。此类错误意味着显存发生不可遏制损坏、重映射失效、NVLink断链、PCIe掉卡或驱动强制要求重置/重启,必须立即将该GPU卡(或所在节点)从调度池屏蔽。

警告类Xid详解与处理建议(13、31、43、63、94)​

以下Xid在生产集群中通常作为警告事件处理,无需立即屏蔽GPU卡。各错误码的官方定义、触发原理、实际案例与处理建议汇总如下表:

Xid官方名称与触发机制实际案例与典型日志特征官方处理建议与排障要点
13Graphics Engine Exception
(图形/计算引擎异常)
SM计算单元在执行CUDA Kernel时遇到数组越界读写(Out Of Range Address)、非法指令(Illegal Instruction)、地址未对齐或非法寄存器访问。
案例:自定义Triton/CUDA算子在特定Batch下数组下标越界,训练抛出illegal memory access并退出。
日志特征:含Graphics SM Warp Exception on (GPC x, TPC y, SM z)。
官方动作:RESTART_APP
1. 不屏蔽卡,驱动会自动回收崩溃进程上下文。
2. 使用compute-sanitizer --tool memcheck或设置CUDA_DEVICE_WAITS_ON_EXCEPTION=1配合cuda-gdb定位越界代码行。
3. 仅当同一物理卡在运行不同正常作业时始终在同一GPC/TPC/SM报错,才需运行dcgmi diag -r 3排查硬件。
31GPU Memory Page Fault
(GPU显存缺页中断)
相当于GPU上的段错误(SIGSEGV)。计算或拷贝单元访问了未映射的虚拟地址、空指针或已提前释放的显存,被MMU硬件拦截。
案例:推理服务开启CUDA Graph后,图内引用的临时张量被提前释放,重放时触发缺页中断。
日志特征:含MMU Fault: ENGINE ... faulted @ 0x... FAULT_PDE ACCESS_TYPE_VIRT_READ。
官方动作:RESTART_APP
1. 不屏蔽卡,MMU拦截后GPU本身完全健康。
2. 重跑任务若“跟任务走”,属代码指针或显存生命周期Bug,用compute-sanitizer排查。
3. 仅当同一UUID显卡跨不同作业高频复现Xid 31时,才排查显存硬件。
43GPU Stopped Processing
(通道重置校验错误)
用户程序因软件异常、核函数死锁超时或被外部信号(如SIGKILL/Ctrl-C)强杀,驱动强制终止并回收其Channel。官方文档明确指出此时GPU保持健康。
案例:分布式训练中某Rank因数据加载卡死被框架看门狗超时Kill,内核打印Xid 43并伴随清理事件Xid 45。
日志特征:含pid=xxx, name=python3, Ch 00000010。
官方动作:IGNORE
1. 严禁因此屏蔽卡,这只是软件异常退出后的正常通道清理动作(常与Xid 45成对出现)。
2. 检查Xid 43前序日志是否有其他核心Xid、宿主机OOM Killer记录或业务侧死锁超时日志。
63Row Remapping / Page Retirement Event
(显存行重映射/页退役记录成功)
发生ECC错误后,驱动成功将待退役页(V100及以前)或待重映射行(A100及以后)写入板载InfoROM。
案例:A800节点因单比特ECC累积或伴随Xid 94触发行重映射登记,业务容器正常运行。
日志特征:含Row Remapper: New row marked for remapping, reset gpu to activate。
官方动作:IGNORE
1. 无需立即屏蔽卡,Xid 63代表硬件自愈记录成功,且坏页已被动态下线隔离。
2. 若单独出现或伴随Xid 94出现,存量任务继续运行,只需在**维护窗口择机执行nvidia-smi -r重置GPU**激活硬件重映射。
3. 若紧跟在严重错误Xid 48/95后出现,则按48/95流程排空重置。
94Contained Memory Error
(受控的显存ECC错误)
适用A100/H100/B100等架构。发生不可纠正ECC错误,但硬件错误遏制机制成功将其限制在单个进程内,并通过动态页面下线隔离了坏页。
案例:一张运行多个推理容器的A100偶发宇宙射线导致ECC翻转,仅1个容器报错退出,其余容器无损运行。
日志特征:含Contained: ... RST: No, D-RST: No(无需立即重置)。
官方动作:RESTART_APP
1. 单次偶发无需屏蔽整卡,仅重启报错的单个进程/容器,同卡其他任务不受影响,择机在维护窗口重置GPU。
2. 注意在k8s-device-plugin中将94与63加入忽略列表以防误封卡。
3. 若同一张卡短时间内高频触发Xid 94,说明显存颗粒持续劣化,需转入屏蔽报修。

警告类Xid常用排查命令​

针对Xid 13/31的代码排查与Xid 63/94的重映射状态检查,常用命令如下:

# 1. 针对 Xid 13 / 31:使用官方 Compute Sanitizer 定位算子越界或非法指针的具体代码行
compute-sanitizer --tool memcheck python3 train.py

# 2. 针对 Xid 63 / 94:查看显存行重映射计数、待生效状态(Pending)与失败标志(Failure)
nvidia-smi -q -d ROW_REMAPER

严重错误类Xid详解与处理建议(48、64、74、79、95、154)​

当检测到以下6类严重Xid时,表明GPU硬件、互联链路或全局上下文已处于不可用状态,必须第一时间屏蔽故障GPU卡(或隔离节点),禁止新任务调度。详细机制、案例与处置建议如下表所示:

Xid官方名称与为什么必须屏蔽GPU卡实际案例与典型日志特征官方恢复流程与RMA报修判定标准
48Double Bit ECC Error (DBE)
(双比特不可纠正ECC错误)
显存(DRAM,新驱动伴随Xid 171)或片上缓存(SRAM/L2,新驱动伴随Xid 172)发生硬件无法修复的多比特错误。未重置前继续调度会导致任务立即崩溃或计算出错。
案例:大模型训练突然中断并抛出cudaErrorECCUncorrectable,内核报Xid 48。
日志特征:含An uncorrectable double bit error (DBE) has been detected on GPU。
官方动作:WORKFLOW_XID_48(排空并重置)
1. 立即屏蔽该卡,排空同节点任务后执行sudo nvidia-smi -i <id> -r重置GPU或重启节点。
2. 执行nvidia-smi -q -d ECC检查:若发生在SRAM且触发SRAM Threshold Exceeded标志(同一Bank超过2次SECDED或4次Parity不可纠正错误),或重置后仍复现Xid 48,直接下线运行Field Diagnostics并申请RMA换卡。
64Row Remapping / Page Retirement Failure
(显存行重映射/页退役记录失败)
驱动尝试向InfoROM记录坏块失败,或硬件备用行已耗尽。此时**GPU已彻底丧失隔离坏显存的自愈能力**,坏块直接暴露给应用。
案例:某老旧A100多次出现显存错误后报Xid 64,同时监控指标DCGM_FI_DEV_ROW_REMAP_FAILURE变为1。
日志特征:含Row Remapper: Failed to record row remapping event to infoROM。
官方动作:RESET_GPU与CONTACT_SUPPORT
1. 立即屏蔽该卡并尝试重置GPU/重启节点。
2. 官方DRAM RMA标准:单Bank已重映射满8行后再出错、已重映射行二次出错、整卡累计重映射达到**512行上限**,均会置位Row Remapper Failure : Yes。一旦置位或重启后仍报Xid 64,直接下线走RMA换卡。
74NVLink Error
(NVLink高速互联错误)
GPU间或与NVSwitch间的高速链路发生物理错误、子链路断开或校验超限(Blackwell架构细化为Xid 144~150)。在完成重置或重启前链路无法恢复,会导致多卡NCCL通信直接卡死。
案例:8卡H800训练中断,多张卡同时报Xid 74。排查发现是GPU 0先发生Xid 79掉卡,导致与之互联的对端卡被动报Xid 74。
日志特征:含NVLink: fatal error detected on link x(0x..., ...)。
官方动作:WORKFLOW_NVLINK_ERR
1. 立即屏蔽相关卡/节点。
2. 先查“连坐效应”(Sympathetic Error):按时间戳对比整机Xid与Fabric Manager的SXid日志,若因对端掉卡引发,优先处理源头卡。
3. 用nvidia-smi nvlink -s/-e查链路状态,看日志首寄存器:Bit 4/5置位(ECC/Parity故障)在同一链路超2次则报修;Bit 8,9,12,16,17,21,22,24,28置位则检查SXM底座或线缆连接。
4. 重启Fabric Manager并重置GPU(或重启整机),用nccl-tests验证。
79GPU has fallen off the bus
(GPU从PCIe总线上脱落/掉卡)
驱动通过PCIe总线访问GPU时完全无响应。此时nvidia-smi报错失联且软重置无效,任何分配上去的容器都会初始化失败。
案例:满载训练瞬态功耗飙升或散热不良,导致显卡触发保护从PCIe总线掉线,8卡节点变成7卡。
日志特征:含GPU has fallen off the bus。
官方动作:RESTART_BM(物理机重启)
1. 立即屏蔽整台节点。
2. 通过`dmesg
95Uncontained Memory Error
(非受控的显存ECC错误)
发生不可纠正ECC错误且波及二级缓存标签(LTC TAG)等跨进程共享结构,硬件错误遏制失败。在重置GPU前,任何新CUDA应用均无法启动。
案例:A100节点日志打印Xid 95,卡上所有容器同时崩溃,后续新调度上去的Pod全部报错退出。
日志特征:含Uncontained: LTC TAG ... RST: Yes, D-RST: No(强制要求重置)。
官方动作:RESET_GPU
1. 立即屏蔽该卡。
2. 若开启了MIG,先排空该物理卡上其余MIG实例的任务再执行GPU Reset;若未开启MIG,立即清理残留进程执行sudo nvidia-smi -i <id> -r重置或重启节点。
3. 重置后检查Row Remapper Failure与SRAM阈值,频繁复现则申请RMA。
154GPU Recovery Action Changed
(GPU恢复动作状态变更)
CUDA 12.7/R565+引入的汇总型元错误码,伴随其他底层严重Xid(如48,64,74,79,95等)出现,直接给出驱动要求系统执行的恢复动作级别。
案例:发生Xid 79或Xid 95后,紧接着打印一条Xid 154指明恢复动作。
日志特征:含GPU recovery action changed from 0x0 (None) to 0x2 (Node Reboot Required)。
官方动作:严格遵循Xid 154指示的状态码
1. 只要目标状态从0x0 (None)变为非零状态(0x1~0x4),必须立即屏蔽该GPU卡。
2. 回溯紧邻的前一条原始Xid定位根因,并按下方状态表执行重置或重启。

Xid 154的五种标准恢复动作状态表​

当捕获到Xid 154时,可根据日志中的目标状态值(对应NVML的nvmlDeviceGetGpuRecoveryAction)直接执行自动化处置:

状态值与名称是否屏蔽卡状态含义与生产执行动作
0x0 (None)否无需恢复操作,GPU处于健康可用状态,可正常接收新进程。
0x1 (GPU Reset Required)是立即屏蔽该卡,终止卡上所有进程,执行sudo nvidia-smi -i <id> -r重置后方可重新启用。
0x2 (Node Reboot Required)是立即屏蔽整台节点,故障已导致系统或总线状态不一致,排空任务后重启物理节点(必要时断电冷重启)。
0x3 (Drain P2P)是立即屏蔽该卡,终止所有使用P2P点对点通信的进程并关闭UVM持久模式,随后再次查询下一步恢复状态。
0x4 (Drain and Reset)是立即屏蔽新任务调度,允许卡上未受影响的存量任务继续运行至结束或Checkpoint,全部排空后执行nvidia-smi -r。

故障GPU卡屏蔽与集群自动化实践​

明确了13, 31, 43, 63, 94仅需告警、48, 64, 74, 79, 95, 154必须屏蔽卡的分级原则后,可在单机环境与Kubernetes集群中按以下方式落地执行。

单机与裸金属环境下的重置与屏蔽操作​

在裸金属服务器上处置严重Xid时,可通过以下命令完成单卡重置或强制屏蔽:

# 1. 尝试软重置故障卡(以 GPU 3 为例,重置前需确保无进程占用 /dev/nvidia3)
sudo fuser -k -9 /dev/nvidia3
sudo nvidia-smi -i 3 -r

# 2. 驱动级强制屏蔽:若坏卡无法立即更换,将其计算模式设为 PROHIBITED(禁止任何进程创建 CUDA 上下文)
sudo nvidia-smi -i 3 -c PROHIBITED
# 待日后硬件修复后恢复默认模式:sudo nvidia-smi -i 3 -c DEFAULT

# 3. 业务级环境变量屏蔽:使用健康卡的 UUID 列表(避免掉卡后数字索引偏移)
export CUDA_VISIBLE_DEVICES=GPU-1f027ee8-6e1e-2b8c-0108-3d370e5f0418,GPU-9e5b8fec-61bf-5124-a0a9-079af1b65cc6

注意:在配备NVSwitch的Ampere架构(如DGX/HGX A100)裸金属节点上,必须确保nvidia-fabricmanager服务处于运行状态,才能使用nvidia-smi -i <id> -r单独重置单张GPU;而在Hopper(H100/H800)及更新架构上,无论Fabric Manager状态如何均支持单卡独立重置。

Kubernetes集群下的单卡自动屏蔽与告警配置​

配置NVIDIA k8s-device-plugin精准屏蔽严重Xid​

NVIDIA k8s-device-plugin通过NVML监听Xid事件,一旦捕获未忽略的Xid,会自动将该卡标记为Unhealthy并上报Kubelet,将其从节点可分配容量(Allocatable)中扣除。

但其源码(internal/rm/health.go)默认仅忽略了13, 31, 43, 45, 68, 109,默认未忽略63和94,容易导致A100/H100偶发受控错误时被误封整卡。生产环境可通过环境变量DP_DISABLE_HEALTHCHECKS与DP_ENABLE_HEALTHCHECKS调整:

# 方式一:在内置忽略列表(13,31,43,45,68,109)基础上,追加忽略 63 和 94(推荐)
env:
- name: DP_DISABLE_HEALTHCHECKS
value: "63,94"

# 方式二:白名单模式,仅当出现指定的严重 Xid 时才将 GPU 标记为 Unhealthy 屏蔽
env:
- name: DP_DISABLE_HEALTHCHECKS
value: "xids"
- name: DP_ENABLE_HEALTHCHECKS
value: "48,64,74,79,95,154"

当故障卡完成nvidia-smi -r重置并通过dcgmi diag -r 2验证后,删除该节点上的nvidia-device-plugin实例Pod使其重建,即可解除Unhealthy屏蔽状态。对于多机8卡分布式训练场景,还可配合Node Problem Detector (NPD)监听/dev/kmsg中的48|64|74|79|95|154正则,直接对整机节点执行Cordon隔离。

配置DCGM-Exporter与Prometheus分级告警规则​

基于DCGM Exporter采集的DCGM_FI_DEV_XID_ERRORS与DCGM_FI_DEV_ROW_REMAP_FAILURE指标,在Prometheus中配置区分警告级与严重屏蔽级的告警规则(注意DCGM_FI_DEV_XID_ERRORS仅保留最近一次Xid值,生产环境建议同时采集宿主机dmesg日志以防连续报错被覆盖):

groups:
- name: gpu-xid-tiered-alerts
rules:
# 1. 警告类 Xid (13, 31, 43, 63, 94):无需立即屏蔽 GPU 卡
- alert: GPUXidWarningEvent
expr: DCGM_FI_DEV_XID_ERRORS == 13 or DCGM_FI_DEV_XID_ERRORS == 31 or DCGM_FI_DEV_XID_ERRORS == 43 or DCGM_FI_DEV_XID_ERRORS == 63 or DCGM_FI_DEV_XID_ERRORS == 94
for: 0m
labels:
severity: warning
annotations:
summary: "节点 {{ $labels.hostname }} GPU {{ $labels.gpu }} 触发警告类 Xid ({{ $value }})"
description: "GPU UUID={{ $labels.UUID }} 报告警告级 Xid {{ $value }}。若为 13/31/43 请排查业务 Pod ({{ $labels.exported_pod }}) 代码;若为 63/94 说明硬件已动态隔离坏页,建议在维护窗口重置 GPU。"

# 2. 严重错误类 Xid (48, 64, 74, 79, 95, 154) 及行重映射失败:必须立即屏蔽 GPU 卡
- alert: GPUXidCriticalIsolationRequired
expr: DCGM_FI_DEV_XID_ERRORS == 48 or DCGM_FI_DEV_XID_ERRORS == 64 or DCGM_FI_DEV_XID_ERRORS == 74 or DCGM_FI_DEV_XID_ERRORS == 79 or DCGM_FI_DEV_XID_ERRORS == 95 or DCGM_FI_DEV_XID_ERRORS == 154 or DCGM_FI_DEV_ROW_REMAP_FAILURE > 0
for: 0m
labels:
severity: critical
annotations:
summary: "节点 {{ $labels.hostname }} GPU {{ $labels.gpu }} 触发致命异常,必须立即屏蔽!"
description: "GPU UUID={{ $labels.UUID }} 触发严重错误(Xid={{ $value }}),请立即确认该卡已标记为 Unhealthy 或节点已 Cordon,并结合 dmesg 执行重置、冷重启或 RMA 报修。"