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 又是电子器件中工作在高温高负载的极限状态,坏卡是常态而非意外。
运维要回答的核心问题:
哪张卡不健康?(监控)
它是硬件坏了还是业务代码写崩了?(故障定性)
坏了怎么不让新任务再调度上去?(隔离)
上面正在跑的任务怎么办?(排干)
坏卡怎么换、怎么走 RMA?(替换)
能不能不用人半夜爬起来处理?(自愈)一句话总结本章:如何让一个几百上千卡的 GPU 集群,在硬件持续坏的前提下,依然对上层任务保持稳定可用。
能力矩阵:
主动健康监控(nvidia-smi / DCGM / dcgmi diag / DCGM Exporter)
↓
故障谱系识别(Xid / SXid / ECC / 温度功耗 → 定性:硬件 or 业务)
↓
故障处理闭环(检测 → cordon → drain → 替换/RMA → 自愈)
↓
版本一致性治理(驱动 / CUDA / 固件 / Fabric Manager 匹配)GPU 健康监控#
nvidia-smi:手上的第一把尺子#
nvidia-smi 是每个 GPU 运维必须条件反射级熟悉的命令。生产上关注的关键指标:
| 指标 | 含义 | 异常信号 |
|---|---|---|
GPU-Util | SM 计算利用率 | 长期 0% = 卡空转;长期 100% 但吞吐低 = 有问题 |
Memory-Usage | 显存占用 | 接近满 = OOM 风险 |
Temp | 核心温度 | > 85°C 告警,> 90°C 会降频(thermal throttle) |
Pwr:Usage/Cap | 功耗/功耗墙 | 贴着 Cap 跑说明满载;异常低可能掉频 |
Perf (P0-P12) | 性能状态 | 满载应在 P0;跑任务却在 P8 说明降频 |
ECC Errors | 显存纠错计数 | Uncorrectable 增长 = 硬件劣化 |
常用运维命令:
# 实时刷新总览(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 多了三样运维刚需的能力:
- 主动健康检查(health watches):后台持续监测 ECC、PCIe、NVLink、温度、供电等子系统,主动上报异常,而不是等你去查。
- 离线/在线诊断(
dcgmi diag):可以主动跑压力测试暴露隐性坏卡。 - Prometheus 集成(DCGM Exporter):标准化指标接入监控栈。
# 启动 DCGM 服务
nv-hostengine
# 查看所有 GPU 的实时健康状态
dcgmi health --check
# 查看某组 GPU 的监控字段
dcgmi dmon -e 155,203,204,1004 # 温度/功耗/util/显存等 field iddcgmi diag——主动诊断,坏卡检测的核心武器:
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:
# 容器方式部署(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_TEMP | GPU 温度 | > 85 warning |
DCGM_FI_DEV_GPU_UTIL | SM 利用率 | 长期 < 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_TOTAL | NVLink 带宽 | 异常低排查互联 |
DCGM_FI_DEV_PCIE_REPLAY_COUNTER | PCIe 重传 | 增长 = 链路质量差 |
DCGM Exporter 开销约 5%,支持全系数据中心 GPU;在 K8s 里跑 NVIDIA GPU Operator 会自动部署并被 Prometheus 抓取,开箱即用。
GPU 故障谱系:Xid / SXid / ECC / 温度功耗#
运维最核心的判断力:看到一个故障信号,能快速定性——是硬件坏了要换卡,还是业务代码写崩了甩锅给硬件。
Xid Error:GPU 故障的错误码#
Xid 是 NVIDIA 驱动打到内核日志(dmesg / /var/log/syslog)里的 GPU 错误码,格式:
dmesg -T | grep -i xid
# NVRM: Xid (PCI:0000:3b:00): 79, GPU has fallen off the bus.运维必背的高频 Xid:
| Xid | 含义 | 定性 | 处理 |
|---|---|---|---|
| 79 | GPU fallen off the bus(掉卡) | 严重硬件故障,卡与总线失联 | 立即隔离,重启主机验证,仍复现走 RMA |
| 48 | Double-bit ECC(不可纠正 ECC) | 硬件劣化,显存物理损坏 | 隔离下线,走 RMA |
| 31 | GPU memory page fault(非法内存访问) | 多为业务代码 bug(越界/野指针);紧跟 Xid 48 出现时才是硬件 | 先查应用;若伴随 48 是硬件 |
| 13 | Graphics engine exception | 多为业务/驱动 | 先查应用与驱动版本 |
| 63 / 64 | ECC page retirement / row remap | 显存坏页被隔离 | 关注计数,超阈值下线 |
| 74 | NVLink error | NVLink/NVSwitch 互联问题 | 查 NVLink、Fabric Manager |
| 45 | Preemptive cleanup(CUDA 任务被中止) | 常是上游致命错误(如 SXid)连带 | 查是否有 SXid/掉卡 |
| 94 / 95 | Contained / Uncontained ECC error | 95 未隔离 = 影响面大 | 95 立即下线 |
定性口诀:
- Xid 79 / 48 / 94-95 / 63-64 → 硬件问题,八九不离十要下线换卡。
- Xid 31 / 13 / 43 → 大概率业务代码或驱动,先别急着甩锅硬件;只有在紧随 double-bit ECC(48)之后级联出现的 Xid 31,才是硬件(坏页正好落在页表里)。
- 单张卡反复出同一 Xid → 硬件嫌疑升级;换个任务/换个节点不复现 → 业务代码。
SXid:NVSwitch/NVLink 的错误码#
多卡整机(HGX/DGX)通过 NVSwitch 互联,NVSwitch 侧的错误码叫 SXid,由 Fabric Manager 上报。致命 SXid 出现在连接两块 GPU 底板的 NVSwitch 端口时,Fabric Manager 会中止所有正在跑的 CUDA 任务并阻止新任务启动,同时 GPU 会连带报 Xid 45。看到大面积 Xid 45 时,要往上游查 SXid 和 NVSwitch/Fabric Manager。
ECC 错误:可纠正 vs 不可纠正#
Single-bit(SBE,可纠正):一个 bit 翻转,ECC 自动纠正,数据不受影响
→ 偶发正常(宇宙射线也会导致),高频增长才关注
Double-bit(DBE,不可纠正):同一字里两个 bit 翻转,ECC 能检出但纠正不了
→ 数据已损坏,几乎都是物理 DRAM 老化
→ 运维铁律:出现 uncorrectable / double-bit ECC 的卡必须下线# 查询 ECC 聚合计数
nvidia-smi --query-gpu=ecc.errors.uncorrected.aggregate.total --format=csv
# 或用 DCGM
dcgmi health --check # 会直接标出 ECC 相关的 unhealthy温度与功耗告警#
温度过高:
> 85°C → warning,检查风道/散热/机房空调
> 90°C → GPU 自动降频(thermal throttle),性能直接掉
持续高温 → 加速硬件老化,ECC/掉卡概率上升
功耗异常:
贴着 power cap → 满载正常
远低于 cap 但任务在跑 → 可能被 throttle(查降频原因)# 查降频原因(thermal / power / hw_slowdown 哪个触发)
nvidia-smi -q -d PERFORMANCE | grep -A8 "Clocks Throttle Reasons"故障处理闭环:检测 → 隔离 → 排干 → 替换 → 自愈#
发现坏卡只是第一步,运维价值在于把坏卡安全地从生产摘除、修复、再放回,且尽量不打扰人。
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 检测 │──▶│ 隔离 │──▶│ 排干 │──▶│ 替换/RMA │──▶│ 重上线 │
│ Xid/ECC/ │ │ cordon │ │ drain │ │ 换卡/送修 │ │ diag 验证 │
│ diag/温度 │ │ 禁新调度 │ │ 迁走任务 │ │ │ │ 再入池 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘1. 检测#
来源三条线:DCGM health watches / DCGM Exporter 告警(Prometheus 规则)、内核日志里的 Xid/SXid、dcgmi diag 主动诊断。
2. 隔离(cordon)——先止血,禁止新任务调度上来#
# K8s:标记节点不可调度(已有任务不动,新任务不再上)
kubectl cordon gpu-node-42
# 给节点打故障标签,方便后续筛选和自动化
kubectl label node gpu-node-42 gpu-health=faulty xid=79 --overwrite3. 排干(drain)——把节点上的任务安全迁走#
# 驱逐节点上的 Pod(忽略 DaemonSet,删本地存储 Pod 前先确认)
kubectl drain gpu-node-42 \
--ignore-daemonsets \
--delete-emptydir-data \
--grace-period=120训练任务的特殊性:训练是有状态的,drain 前要确认任务能从 checkpoint 恢复(详见专题 02),否则粗暴驱逐 = 训练进度丢失。推理任务一般无状态,drain 相对安全。
4. 替换 / RMA#
现场处理:
- 掉卡(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 验证 → 重新入池# 采集 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 集群一大类「假故障」其实是版本不匹配,运维要盯的一致性关系:
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 不可用,多卡任务起不来。
# 查驱动 + 驱动支持的 CUDA 版本(右上角 CUDA Version 是驱动支持的上限,不是安装的)
nvidia-smi
# 查实际安装的 CUDA Toolkit 版本
nvcc --version
# 查 Fabric Manager 状态(NVSwitch 机型必查)
systemctl status nvidia-fabricmanager
nv-fabricmanager --version
# 检查驱动内核模块是否正常加载
lsmod | grep nvidia版本不匹配的典型排查:
现象:容器里跑任务报 "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 的运维差异#
基础概念(切分方式、隔离级别)已在算力调度章节讲过,这里只补运维差异。
| 维度 | MIG | MPS | vGPU |
|---|---|---|---|
| 故障隔离 | 强,实例硬件级隔离,一个坏不影响其他 | 弱,共享 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:一个节点某张卡掉了,怎么定位处理#
# 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 利用率不低但请求很慢 / 利用率虚高#
陷阱: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 不匹配#
现象:新拉的容器任务起不来,报 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 集群运维与故障管理的核心能力:
主动监控 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 一致性,再怀疑硬件。
下一专题进入 大规模训练稳定性保障——当这些坏卡发生在千卡训练任务中间时,怎么让训练自动中断、恢复、重调度,而不是从头再来。