路线图

01 GPU 集群运维与故障管理

星辉 2026-07-02 阅读 7 min 1,356 字 路线图
01 GPU 集群运维与故障管理 封面

学习目标:能对生产 GPU 集群做主动健康监控(nvidia-smi / DCGM / DCGM Exporter → Prometheus);看懂 GPU 故障谱系(Xid / SXid / ECC / 温度功耗)并判断是硬件坏卡还是业务代码问题;掌握「检测 → 隔离 → 排干 → 替换/RMA → 自愈」的故障处理闭环;能管理驱动/固件/CUDA/Fabric Manager 的版本匹配。 重点度:必会(运维核心) 视角声明:本章是 GPU 集群 SRE/运维视角——怎么监控、怎么发现坏卡、怎么排查、怎么隔离恢复。不涉及 GPU 编程、算子开发、CUDA kernel 编写。


概述#

GPU 集群和普通服务器集群最大的区别:硬件更贵、故障率更高、故障影响更大。一张 H100 单价几万美元,一个 8 卡节点几十万;而 GPU 又是电子器件中工作在高温高负载的极限状态,坏卡是常态而非意外

运维要回答的核心问题:

text
哪张卡不健康?(监控)
它是硬件坏了还是业务代码写崩了?(故障定性)
坏了怎么不让新任务再调度上去?(隔离)
上面正在跑的任务怎么办?(排干)
坏卡怎么换、怎么走 RMA?(替换)
能不能不用人半夜爬起来处理?(自愈)

一句话总结本章:如何让一个几百上千卡的 GPU 集群,在硬件持续坏的前提下,依然对上层任务保持稳定可用。

能力矩阵:

text
主动健康监控(nvidia-smi / DCGM / dcgmi diag / DCGM Exporter)
故障谱系识别(Xid / SXid / ECC / 温度功耗 → 定性:硬件 or 业务)
故障处理闭环(检测 → cordon → drain → 替换/RMA → 自愈)
版本一致性治理(驱动 / CUDA / 固件 / Fabric Manager 匹配)

GPU 健康监控#

nvidia-smi:手上的第一把尺子#

nvidia-smi 是每个 GPU 运维必须条件反射级熟悉的命令。生产上关注的关键指标:

指标含义异常信号
GPU-UtilSM 计算利用率长期 0% = 卡空转;长期 100% 但吞吐低 = 有问题
Memory-Usage显存占用接近满 = OOM 风险
Temp核心温度> 85°C 告警,> 90°C 会降频(thermal throttle)
Pwr:Usage/Cap功耗/功耗墙贴着 Cap 跑说明满载;异常低可能掉频
Perf (P0-P12)性能状态满载应在 P0;跑任务却在 P8 说明降频
ECC Errors显存纠错计数Uncorrectable 增长 = 硬件劣化

常用运维命令:

bash
# 实时刷新总览(1 秒一次)
nvidia-smi -l 1

# 只看关键字段,脚本化采集友好
nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,\
memory.used,memory.total,power.draw,ecc.errors.uncorrected.aggregate.total \
--format=csv,noheader,nounits

# 查询哪些进程占了哪张卡(定位是谁在用)
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv

# 查看降频原因(thermal / power / hw_slowdown)
nvidia-smi -q -d PERFORMANCE | grep -A6 "Clocks Throttle Reasons"

# 查看 ECC 错误明细
nvidia-smi -q -d ECC | grep -A20 "ECC Errors"

# 查看 NVLink 状态(多卡互联)
nvidia-smi nvlink -s

运维要点:nvidia-smi 是被动查询工具,适合人工排障,不适合集群级持续监控——它无法主动发现「即将坏」的卡,也不能跑诊断。集群级监控必须上 DCGM。

DCGM:数据中心级主动健康监控#

DCGM(Data Center GPU Manager) 是 NVIDIA 官方的数据中心 GPU 管理框架,相比 nvidia-smi 多了三样运维刚需的能力:

  1. 主动健康检查(health watches):后台持续监测 ECC、PCIe、NVLink、温度、供电等子系统,主动上报异常,而不是等你去查。
  2. 离线/在线诊断dcgmi diag):可以主动跑压力测试暴露隐性坏卡。
  3. Prometheus 集成(DCGM Exporter):标准化指标接入监控栈。
bash
# 启动 DCGM 服务
nv-hostengine

# 查看所有 GPU 的实时健康状态
dcgmi health --check

# 查看某组 GPU 的监控字段
dcgmi dmon -e 155,203,204,1004  # 温度/功耗/util/显存等 field id

dcgmi diag——主动诊断,坏卡检测的核心武器:

bash
dcgmi diag -r 1   # Level 1:快速检查(软件/部署,秒级)
dcgmi diag -r 2   # Level 2:中等,加 PCIe/NVLink 等(分钟级)
dcgmi diag -r 3   # Level 3:深度压测(显存/PCIe/NVLink/SM stress 等多项测试),单节点耗时数分钟
dcgmi diag -r 4   # Level 4:最长最全的极限诊断

诊断分级的运维用法:

  • 节点上线前 / 换卡后:跑 -r 3,确认卡是真健康再放回调度池。
  • 怀疑某卡有隐性问题(任务偶发报错、性能抖动):-r 3-r 4 压出来。
  • 日常巡检-r 1-r 2,不影响在跑任务。

注意-r 3/4 会独占 GPU 跑压力测试,不能在有业务任务的卡上跑——必须先 drain。

DCGM Exporter → Prometheus → Grafana#

集群级监控的标准姿势:DCGM Exporter 把 DCGM 指标转成 Prometheus 格式,暴露在 :9400/metrics

bash
# 容器方式部署(K8s 里用 GPU Operator 会自动装好)
docker run -d --gpus all --rm -p 9400:9400 \
  nvcr.io/nvidia/k8s/dcgm-exporter:latest

curl localhost:9400/metrics | grep DCGM_FI_DEV

关键指标(Prometheus 里的名字):

指标含义告警建议
DCGM_FI_DEV_GPU_TEMPGPU 温度> 85 warning
DCGM_FI_DEV_GPU_UTILSM 利用率长期 < 20% 排查空转
DCGM_FI_DEV_FB_USED / FB_FREE显存已用/剩余接近满告警
DCGM_FI_DEV_POWER_USAGE功耗对比 cap
DCGM_FI_DEV_ECC_DBE_VOL_TOTAL不可纠正 ECC(double-bit)> 0 立即告警,准备下线
DCGM_FI_DEV_ECC_SBE_VOL_TOTAL可纠正 ECC(single-bit)增长快要关注
DCGM_FI_DEV_XID_ERRORS最近 Xid 错误码非 0 按 Xid 谱系处理
DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTALNVLink 带宽异常低排查互联
DCGM_FI_DEV_PCIE_REPLAY_COUNTERPCIe 重传增长 = 链路质量差

DCGM Exporter 开销约 5%,支持全系数据中心 GPU;在 K8s 里跑 NVIDIA GPU Operator 会自动部署并被 Prometheus 抓取,开箱即用。


GPU 故障谱系:Xid / SXid / ECC / 温度功耗#

运维最核心的判断力:看到一个故障信号,能快速定性——是硬件坏了要换卡,还是业务代码写崩了甩锅给硬件。

Xid Error:GPU 故障的错误码#

Xid 是 NVIDIA 驱动打到内核日志(dmesg / /var/log/syslog)里的 GPU 错误码,格式:

bash
dmesg -T | grep -i xid
# NVRM: Xid (PCI:0000:3b:00): 79, GPU has fallen off the bus.

运维必背的高频 Xid:

Xid含义定性处理
79GPU fallen off the bus(掉卡)严重硬件故障,卡与总线失联立即隔离,重启主机验证,仍复现走 RMA
48Double-bit ECC(不可纠正 ECC)硬件劣化,显存物理损坏隔离下线,走 RMA
31GPU memory page fault(非法内存访问)多为业务代码 bug(越界/野指针);紧跟 Xid 48 出现时才是硬件先查应用;若伴随 48 是硬件
13Graphics engine exception多为业务/驱动先查应用与驱动版本
63 / 64ECC page retirement / row remap显存坏页被隔离关注计数,超阈值下线
74NVLink errorNVLink/NVSwitch 互联问题查 NVLink、Fabric Manager
45Preemptive cleanup(CUDA 任务被中止)常是上游致命错误(如 SXid)连带查是否有 SXid/掉卡
94 / 95Contained / Uncontained ECC error95 未隔离 = 影响面大95 立即下线

定性口诀:

  • Xid 79 / 48 / 94-95 / 63-64 → 硬件问题,八九不离十要下线换卡。
  • Xid 31 / 13 / 43 → 大概率业务代码或驱动,先别急着甩锅硬件;只有在紧随 double-bit ECC(48)之后级联出现的 Xid 31,才是硬件(坏页正好落在页表里)。
  • 单张卡反复出同一 Xid → 硬件嫌疑升级;换个任务/换个节点不复现 → 业务代码。

多卡整机(HGX/DGX)通过 NVSwitch 互联,NVSwitch 侧的错误码叫 SXid,由 Fabric Manager 上报。致命 SXid 出现在连接两块 GPU 底板的 NVSwitch 端口时,Fabric Manager 会中止所有正在跑的 CUDA 任务并阻止新任务启动,同时 GPU 会连带报 Xid 45。看到大面积 Xid 45 时,要往上游查 SXid 和 NVSwitch/Fabric Manager。

ECC 错误:可纠正 vs 不可纠正#

text
Single-bit(SBE,可纠正):一个 bit 翻转,ECC 自动纠正,数据不受影响
  → 偶发正常(宇宙射线也会导致),高频增长才关注

Double-bit(DBE,不可纠正):同一字里两个 bit 翻转,ECC 能检出但纠正不了
  → 数据已损坏,几乎都是物理 DRAM 老化
  → 运维铁律:出现 uncorrectable / double-bit ECC 的卡必须下线
bash
# 查询 ECC 聚合计数
nvidia-smi --query-gpu=ecc.errors.uncorrected.aggregate.total --format=csv
# 或用 DCGM
dcgmi health --check   # 会直接标出 ECC 相关的 unhealthy

温度与功耗告警#

text
温度过高:
  > 85°C  → warning,检查风道/散热/机房空调
  > 90°C  → GPU 自动降频(thermal throttle),性能直接掉
  持续高温 → 加速硬件老化,ECC/掉卡概率上升

功耗异常:
  贴着 power cap → 满载正常
  远低于 cap 但任务在跑 → 可能被 throttle(查降频原因)
bash
# 查降频原因(thermal / power / hw_slowdown 哪个触发)
nvidia-smi -q -d PERFORMANCE | grep -A8 "Clocks Throttle Reasons"

故障处理闭环:检测 → 隔离 → 排干 → 替换 → 自愈#

发现坏卡只是第一步,运维价值在于把坏卡安全地从生产摘除、修复、再放回,且尽量不打扰人。

text
┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐
│  检测     │──▶│  隔离     │──▶│  排干     │──▶│ 替换/RMA │──▶│  重上线   │
│ Xid/ECC/ │   │ cordon   │   │  drain   │   │ 换卡/送修 │   │ diag 验证 │
│ diag/温度 │   │ 禁新调度  │   │ 迁走任务  │   │           │   │ 再入池   │
└──────────┘   └──────────┘   └──────────┘   └──────────┘   └──────────┘

1. 检测#

来源三条线:DCGM health watches / DCGM Exporter 告警(Prometheus 规则)、内核日志里的 Xid/SXid、dcgmi diag 主动诊断。

2. 隔离(cordon)——先止血,禁止新任务调度上来#

bash
# K8s:标记节点不可调度(已有任务不动,新任务不再上)
kubectl cordon gpu-node-42

# 给节点打故障标签,方便后续筛选和自动化
kubectl label node gpu-node-42 gpu-health=faulty xid=79 --overwrite

3. 排干(drain)——把节点上的任务安全迁走#

bash
# 驱逐节点上的 Pod(忽略 DaemonSet,删本地存储 Pod 前先确认)
kubectl drain gpu-node-42 \
  --ignore-daemonsets \
  --delete-emptydir-data \
  --grace-period=120

训练任务的特殊性:训练是有状态的,drain 前要确认任务能从 checkpoint 恢复(详见专题 02),否则粗暴驱逐 = 训练进度丢失。推理任务一般无状态,drain 相对安全。

4. 替换 / RMA#

text
现场处理:
  - 掉卡(Xid 79):先整机重启,重启后 dcgmi diag -r 3 复测
    · 复测通过 → 偶发,观察后重新上线
    · 复测仍失败 / 反复掉卡 → 硬件坏,走 RMA
  - Double-bit ECC / uncontained:直接标记待换,不必反复试

RMA 流程(Return Merchandise Authorization,厂商保修换货):
  - 记录:GPU 序列号(nvidia-smi -q | grep Serial)、Xid 日志、diag 报告
  - 提交厂商 → 换新卡 → 装机 → diag -r 3 验证 → 重新入池
bash
# 采集 RMA 需要的信息
nvidia-smi -q | grep -E "Serial Number|GPU UUID|VBIOS"

5. 自愈系统——不让人半夜爬起来#

大集群靠人肉执行上面 5 步不现实,成熟团队都会上自愈系统:检测到故障自动 cordon + drain + 触发换卡/重装工单,全流程无人干预。

  • NVIDIA NVSentinel(2025-2026):官方开源的 K8s GPU 故障检测与自愈服务。基于 DCGM(经 GPU Operator 部署)监控 GPU 健康,同时扫 journald/syslog 里的 Xid、SXid(NVSwitch/NVLink)、掉卡事件;分析器把节点判为 degraded 后自动 cordon、drain 并触发重供给工作流,全程无人干预。NVIDIA 内部已用它维护 4 万+ 卡规模;支持本地或云上部署,并对接 AWS/GCP/OCI 的维护事件 API。
  • 360 QihooSMI(自研自愈参考):思路一致——对 ECC 错误、掉卡、网卡异常做检测 + 自愈,是国内自研自愈系统的代表参考。

自愈系统的运维价值:把「凌晨掉卡→人工发现→手动 cordon/drain→提工单」压缩成秒级自动闭环,人只需要处理最后的物理换卡。


驱动 / 固件 / CUDA / Fabric Manager 版本管理#

GPU 集群一大类「假故障」其实是版本不匹配,运维要盯的一致性关系:

text
NVIDIA 驱动 ── 决定 ──▶ 支持的最高 CUDA 运行时版本
   ├── CUDA Toolkit(容器内):可 ≤ 驱动支持版本(向后兼容)
   ├── Fabric Manager:版本必须与驱动严格一致(NVSwitch 机型)
   ├── NVIDIA Container Toolkit:容器透传 GPU
   └── GPU 固件 / VBIOS:厂商发布,偶尔需刷新

关键铁律:

  • CUDA 向后兼容:驱动版本决定支持的最高 CUDA;容器里用比驱动更新的 CUDA 会报 CUDA driver version is insufficient for CUDA runtime version
  • Fabric Manager 必须和驱动版本精确匹配:不匹配则 nvidia-smi 报 NVSwitch/NVLink 不可用,多卡任务起不来。
bash
# 查驱动 + 驱动支持的 CUDA 版本(右上角 CUDA Version 是驱动支持的上限,不是安装的)
nvidia-smi

# 查实际安装的 CUDA Toolkit 版本
nvcc --version

# 查 Fabric Manager 状态(NVSwitch 机型必查)
systemctl status nvidia-fabricmanager
nv-fabricmanager --version

# 检查驱动内核模块是否正常加载
lsmod | grep nvidia

版本不匹配的典型排查:

text
现象:容器里跑任务报 "CUDA driver version is insufficient"
  → 宿主机驱动太老,升级驱动,或容器换用低版本 CUDA 镜像

现象:多卡任务报 NVLink/NVSwitch 不可用,单卡任务正常
  → 查 Fabric Manager 是否运行、版本是否和驱动一致
  → systemctl restart nvidia-fabricmanager

现象:装完驱动 nvidia-smi 报 "couldn't communicate with driver"
  → 内核模块没加载(可能内核升级后 DKMS 没重编),或有旧模块残留

MIG / MPS / vGPU 的运维差异#

基础概念(切分方式、隔离级别)已在算力调度章节讲过,这里只补运维差异

维度MIGMPSvGPU
故障隔离,实例硬件级隔离,一个坏不影响其他,共享 context,一个进程崩可能拖垮整卡中等,虚拟化层隔离
运维额外动作需管理 MIG profile 的创建/销毁;nvidia-smi mig需管 MPS control daemon 生命周期依赖 vGPU 授权 license 服务器
监控粒度DCGM 支持按 MIG 实例采指标只能整卡粒度,看不清单个进程按 vGPU 实例
排障重点profile 配置错、实例没释放单进程崩溃影响面、context 泄漏license 过期、心跳丢失

运维视角结论:

  • MIG:隔离最好,训练/多租户推理优先,但要维护 profile 生命周期(任务结束记得销毁实例,否则碎片化)。
  • MPS:性能好但隔离弱,只在可信同租户场景用;监控看不清单进程,出问题排查更难。
  • vGPU:额外多一个 license 服务器要监控——license 服务挂了 vGPU 全线掉,这是 vGPU 独有的运维单点。

实战要点#

实战 1:一个节点某张卡掉了,怎么定位处理#

bash
# 1. 确认哪张卡、什么错
dmesg -T | grep -i xid | tail -20
#   看到 Xid 79 → 掉卡;Xid 48 → double-bit ECC

# 2. 看这张卡还在不在(掉卡时 nvidia-smi 可能只剩 7 张)
nvidia-smi

# 3. 立即隔离,止血
kubectl cordon gpu-node-42
kubectl label node gpu-node-42 gpu-health=faulty --overwrite

# 4. 迁走任务
kubectl drain gpu-node-42 --ignore-daemonsets --delete-emptydir-data

# 5. 定性:整机重启后复测
#    reboot 后:
dcgmi diag -r 3
#    通过 → 偶发,观察后重新上线(kubectl uncordon)
#    仍失败/反复掉卡 → 采集序列号+日志走 RMA

实战 2:GPU 利用率不低但请求很慢 / 利用率虚高#

text
陷阱:GPU-Util 是「有 kernel 在跑的时间占比」,不代表算力真的用满
  → 一个占 1% 算力的 kernel 一直跑,Util 也显示 100%

排查路径:
1. 看降频:nvidia-smi -q -d PERFORMANCE | grep Throttle
   → thermal/power throttle 会让「在跑但很慢」
2. 看真实算力占用:DCGM 的 DCGM_FI_PROF_SM_ACTIVE / PIPE_TENSOR_ACTIVE
   → SM_ACTIVE 低但 GPU_UTIL 高 = 算力没吃满(可能 batch 太小/CPU 瓶颈/IO 等待)
3. 看 PCIe/NVLink:DCGM_FI_DEV_PCIE_REPLAY_COUNTER 增长 = 链路差,数据搬运慢
4. 看显存带宽和 host↔device 拷贝:是不是卡在数据喂不进去

实战 3:驱动 / CUDA 不匹配#

text
现象:新拉的容器任务起不来,报 CUDA driver version insufficient
排查:
1. nvidia-smi 右上角看驱动支持的最高 CUDA(如 12.4)
2. 容器镜像里 nvcc --version 看用的 CUDA(如 12.6)→ 超了
3. 解决:升级宿主机驱动 / 换低版本 CUDA 镜像
4. NVSwitch 机型额外查:systemctl status nvidia-fabricmanager 是否 running 且版本与驱动一致

小结#

GPU 集群运维与故障管理的核心能力:

text
主动监控    nvidia-smi(人工排障)+ DCGM(集群主动健康)+ DCGM Exporter → Prometheus
故障定性    Xid/SXid/ECC/温度功耗 → 快速判断「硬件坏 vs 业务代码」
处理闭环    检测 → cordon 隔离 → drain 排干 → 替换/RMA → diag 验证再上线
自愈        NVSentinel / QihooSMI 把闭环自动化,人只管物理换卡
版本治理    驱动 ⊃ CUDA(向后兼容);Fabric Manager 必须与驱动精确匹配

2026 年的关键认知:

  • 坏卡是常态:几百上千卡集群,坏卡/掉卡天天有,运维的价值是让它对上层透明。
  • 定性能力是核心:Xid 79/48 是硬件,Xid 31 多是业务——甩锅甩对方向能省大量时间。
  • double-bit ECC / 掉卡的卡必须下线,不要抱侥幸。
  • 自愈是大集群的刚需:NVSentinel 这类工具已经成熟,秒级自动闭环取代人肉半夜处理。
  • 一半的「故障」其实是版本不匹配:先查驱动/CUDA/Fabric Manager 一致性,再怀疑硬件。

下一专题进入 大规模训练稳定性保障——当这些坏卡发生在千卡训练任务中间时,怎么让训练自动中断、恢复、重调度,而不是从头再来。