跳到主要内容

硬件监控与排障

大模型服务能启动不代表能长期稳定运行。线上真正难处理的问题,往往不是“模型不会推理”,而是 GPU 利用率忽高忽低、显存突然打满、温度降频、Xid 错误、驱动异常、某张卡掉线,最后表现为请求超时、吞吐下降或训练任务 hang 住。

硬件监控的目标不是堆一堆指标,而是回答三个问题:

  1. 资源是否真的被有效使用。
  2. 当前瓶颈在 GPU、显存、CPU、网络、存储还是调度。
  3. 异常发生时,能不能快速定位到进程、卡、节点和时间段。
核心判断

大模型硬件排障要同时看“业务指标”和“硬件指标”。 只看 nvidia-smi 不够,因为 GPU 利用率正常也可能 P99 延迟很差;只看接口延迟也不够,因为根因可能是显存碎片、ECC 错误、PCIe 降速、温度降频或某个 worker 被调度到错误拓扑。

1. 监控对象

大模型训练和推理至少要覆盖这些对象:

对象关键问题常用指标
GPU算力是否被吃满,是否降频或报错utilization、SM utilization、clock、temperature、power、Xid
显存模型、KV Cache 和运行时开销是否有余量used memory、free memory、reserved memory、OOM 次数
GPU 互联多卡通信是否成为瓶颈NVLink / PCIe 吞吐、NCCL 性能、拓扑
CPU / 内存tokenizer、调度、后处理是否拖慢 GPUCPU utilization、load average、RSS、page cache、swap
存储模型加载、checkpoint、日志是否受阻IO latency、throughput、inode、磁盘空间
网络多机通信、模型分发、请求入口是否稳定bandwidth、retransmit、packet drop、RDMA counters
进程哪个服务占用了资源,是否泄漏PID、容器、模型实例、显存占用、重启次数

实际运维中,最有价值的是把这些指标和业务维度关联起来,例如:

  • 哪个模型实例。
  • 哪个 GPU UUID。
  • 哪个节点。
  • 哪个容器或 Pod。
  • 哪个版本的模型和推理框架。
  • 哪段压测或线上流量。

否则看到“显存满了”也很难判断是正常预留、请求突发、内存泄漏还是其他进程抢卡。

2. nvidia-smi 能看什么

nvidia-smi 是最常用的 GPU 现场诊断工具,适合快速判断卡是否存在、驱动是否可用、显存是否被占用、温度和功耗是否异常。

常用命令:

nvidia-smi
nvidia-smi -L
nvidia-smi pmon -s um
nvidia-smi dmon -s pucvmt
nvidia-smi topo -m

含义大致如下:

命令用途
nvidia-smi查看 GPU、驱动、CUDA 版本、显存、功耗、温度和进程
nvidia-smi -L列出 GPU 和 UUID,适合和监控标签对齐
nvidia-smi pmon按进程查看 GPU 使用情况
nvidia-smi dmon连续采样 GPU 功耗、温度、显存、利用率
nvidia-smi topo -m查看 GPU、CPU、网卡之间的拓扑关系

如果只想取结构化字段,可以用:

nvidia-smi --query-gpu=index,uuid,name,temperature.gpu,power.draw,utilization.gpu,utilization.memory,memory.used,memory.total,ecc.errors.uncorrected.volatile.total --format=csv

排障时建议记录:

  • GPU index 和 GPU UUID。
  • driver version 和 CUDA version。
  • 当前进程 PID。
  • 显存占用和 GPU 利用率。
  • 温度、功耗、时钟频率。
  • 是否有 ECC / Xid 错误。

注意:GPU index 可能因为重启、容器映射或调度方式变化而改变,生产监控里更建议使用 GPU UUID 作为稳定标识。

3. DCGM 和生产监控

nvidia-smi 适合人工现场排查,生产环境更常用 NVIDIA DCGM 采集指标,再接入 Prometheus、Grafana 或其他监控系统。

DCGM 的价值在于:

  • 可以持续采集 GPU 健康状态。
  • 能暴露更细的硬件计数器。
  • 适合 Kubernetes 或多节点集群统一监控。
  • 能记录 ECC、Xid、PCIe、NVLink 等异常。
  • 可以和告警系统联动。

常见采集链路:

GPU
-> DCGM / DCGM Exporter
-> Prometheus
-> Grafana
-> Alertmanager

监控面板建议至少分四层:

面板关注点
节点视图单台机器上的 GPU、CPU、内存、磁盘、网络是否健康
GPU 视图每张卡的利用率、显存、温度、功耗、错误计数
服务视图每个模型实例的 QPS、TTFT、TPOT、P95 / P99、错误率
集群视图多节点资源分布、掉卡、重启、调度失败、热点节点

对于大模型推理,硬件监控最好和推理框架指标一起看,例如:

  • 当前 running requests。
  • waiting queue 长度。
  • batch size。
  • KV Cache 使用率。
  • prefill / decode token 吞吐。
  • TTFT 和 TPOT。
  • 由于 OOM、限流、超时导致的失败数。

只有 GPU 指标没有业务指标,容易误判。例如 GPU 利用率低,可能是没有流量,也可能是 tokenizer、调度、网络、存储或 batch 策略拖住了 GPU。

4. GPU 利用率怎么看

GPU utilization 不是越高越好,也不是越低就一定浪费。它必须结合场景判断。

场景常见现象判断方式
训练GPU 利用率应相对持续较高如果周期性掉到很低,检查数据加载、通信、checkpoint
推理 prefill短时间算力压力高长 prompt、批处理会拉高利用率
推理 decode可能更受显存带宽影响小 batch 下 GPU utilization 不一定很高
低流量服务GPU 利用率低是正常现象重点看延迟、成本和扩缩容策略
高并发服务GPU 利用率高但 P99 差检查队列、batch、KV Cache、限流和调度

常见误区:

  • 只看平均利用率:平均 70% 看起来不错,但如果周期性掉到 0%,训练 step time 可能很差。
  • 把低利用率都当成 GPU 问题:数据加载、CPU tokenizer、网络转发、存储读取都可能让 GPU 等待。
  • 把高利用率都当成健康:GPU 满载但请求排队严重,用户体验仍然很差。
  • 忽略 memory utilization:decode 阶段可能受显存带宽限制,而不是纯算力限制。

排查 GPU 利用率低时,可以按这个顺序看:

  1. 是否真的有足够请求或训练 batch。
  2. CPU、tokenizer、数据加载是否成为瓶颈。
  3. 是否频繁等待网络、存储或 checkpoint。
  4. batch 策略是否过于保守。
  5. 多卡通信是否拖慢 step 或 decode。
  6. 是否有某张卡成为 straggler。

5. 显存监控

显存是 LLM 部署中最容易触发硬错误的资源。推理时可以粗略理解为:

显存占用 = 模型权重 + KV Cache + 激活/临时张量 + runtime / workspace + 通信缓冲 + 预留内存池

生产监控要区分:

指标含义排障价值
used memory已被进程占用或预留的显存判断是否接近 OOM
free memory当前剩余显存判断是否还有突发余量
reserved memory框架预留但未必实际使用的显存区分正常预留和泄漏
KV Cache usageKV Cache 块或页的使用率判断长上下文和并发压力
OOM countOOM 发生次数判断是否需要限流或调整配置

显存高占用不一定是异常。vLLM、TensorRT-LLM、SGLang 等推理框架可能会预留大块显存来减少动态分配和碎片。真正要关注的是:

  • 显存是否持续增长且不回落。
  • OOM 是否集中在长输入、高并发或特定模型版本。
  • 空闲显存是否足以覆盖 P95 / P99 请求长度。
  • 是否有无关进程占用同一张卡。
  • 是否多实例共用 GPU 导致互相抢显存。

更多显存组成见:显存模型尺寸与显存估算

6. OOM 排查

OOM 要先判断发生阶段,不同阶段的处理方向完全不同。

阶段典型现象常见原因处理方向
模型加载服务启动失败权重太大、精度太高、GPU 不够换小模型、量化、多卡切分、换更大显存
prefill长输入时报错prompt 太长、batch 太大、临时张量过多限制输入长度、调低 batch、启用更优 attention
decode生成过程中显存上涨KV Cache 增长、并发过高、输出过长限制并发和输出长度、KV Cache 优化
长时间运行后开始正常,运行一段时间后 OOM显存碎片、泄漏、请求分布变化重启实例、升级框架、调整内存池
多服务共存单独运行正常,共存后失败多进程抢显存绑定 GPU、隔离实例、限制显存比例

排查步骤:

  1. 记录 OOM 的时间、模型、请求长度、并发和 GPU UUID。
  2. 确认 OOM 发生在加载、prefill、decode 还是运行一段时间后。
  3. nvidia-smi 查是否有其他进程占用显存。
  4. 查看推理框架日志里的 max context、batch、KV Cache 配置。
  5. 检查最近是否改过模型精度、上下文长度、并发上限或框架版本。
  6. 用真实流量分布压测,而不是只用短 prompt 测试。

常用缓解手段:

  • 降低 max_model_len
  • 降低最大并发或 batch 上限。
  • 限制最大输入和输出 token。
  • 使用 INT8 / INT4 量化。
  • 启用 PagedAttention、KV Cache 量化或 FP8 KV Cache。
  • 减少同一张卡上的模型实例数。
  • 为热更新、突发流量和长尾请求保留显存余量。

不要只用“模型能启动”作为上线标准。上线前必须用接近真实的输入长度、输出长度和并发分布压测 OOM 边界。

7. 温度、功耗和降频

GPU 温度和功耗异常会直接影响性能稳定性。很多“吞吐突然下降”的问题,本质上是散热、供电或功耗限制导致的降频。

需要关注:

指标异常表现可能原因
temperature温度持续偏高风道差、机房温度高、灰尘、风扇异常
power draw长期贴近功耗上限任务满载、功耗限制过低、供电不足
clocks频率低于预期温度墙、功耗墙、驱动策略、MIG / vGPU 限制
throttle reason出现 thermal / power throttle散热或供电约束

现场可以看:

nvidia-smi dmon -s pucvmt
nvidia-smi -q -d TEMPERATURE,POWER,CLOCK,PERFORMANCE

处理方向:

  • 检查机箱风道、风扇、灰尘和机房温度。
  • 确认 GPU 是否长期触发 thermal throttle 或 power throttle。
  • 检查功耗上限是否被人为设置过低。
  • 检查同机多卡是否存在某张卡温度明显高于其他卡。
  • 对高密度服务器,确认进风温度和机柜散热能力。

温度和功耗问题通常不是靠改模型参数解决的。如果硬件长期处于边界状态,即使服务能跑,也会带来延迟抖动和故障率上升。

8. ECC、Xid 和硬件错误

ECC 和 Xid 是 GPU 健康监控里最重要的错误信号。

8.1 ECC

ECC 用于发现和纠正显存位错误。需要区分:

类型含义处理建议
corrected ECC已纠正错误少量偶发可观察,持续增长要关注
uncorrected ECC未纠正错误高风险,建议隔离节点或更换硬件
volatile ECC当前运行周期内统计重启后可能清零
aggregate ECC累计统计用于判断硬件长期健康

如果 uncorrected ECC 出现,训练可能 silent corruption,推理可能产生错误结果或进程崩溃。生产环境应把这类节点从调度池摘除,保留日志后做硬件诊断。

8.2 Xid

Xid 是 NVIDIA 驱动报告的 GPU 错误代码,通常出现在系统日志或 dmesg 中。

查看方式:

dmesg -T | grep -i xid
journalctl -k | grep -i xid

常见诱因包括:

  • 驱动或 CUDA 版本不兼容。
  • GPU 硬件异常。
  • PCIe 链路问题。
  • 电源或散热问题。
  • kernel 执行异常。
  • 容器或多进程访问 GPU 的方式不正确。

处理建议:

  1. 记录 Xid code、GPU UUID、时间和对应进程。
  2. 查同一台机器是否多张卡同时报错。
  3. 查是否伴随温度、功耗、ECC 或 PCIe 错误。
  4. 对比最近是否升级驱动、CUDA、内核或推理框架。
  5. 频繁复现时先摘除节点,再做驱动和硬件诊断。

不要只重启服务后继续使用。频繁 Xid 可能说明硬件或驱动状态已经不可信。

9. GPU 掉卡和驱动问题

GPU 掉卡通常表现为:

  • nvidia-smi 看不到某张卡。
  • 容器内看不到 GPU。
  • 训练任务 hang 住或 NCCL 报错。
  • 推理 worker 重启后无法重新绑定 GPU。
  • 系统日志出现 PCIe、Xid 或驱动错误。

基础排查:

nvidia-smi -L
lspci | grep -i nvidia
lsmod | grep nvidia
dmesg -T | grep -i nvidia
dmesg -T | grep -i xid

判断方向:

现象可能原因
lspci 看不到 GPU硬件、主板、供电、PCIe 插槽或固件问题
lspci 能看到但 nvidia-smi 看不到驱动加载失败、版本不匹配、内核模块异常
宿主机正常,容器看不到runtime、设备映射、权限或 Kubernetes device plugin 问题
任务运行中掉卡Xid、过热、供电、PCIe 链路或驱动崩溃
多机任务 hang某节点 GPU 异常触发 NCCL 等待

生产处理原则:

  • 先隔离异常节点,避免调度新任务。
  • 保留 nvidia-smi -qdmesg、驱动版本和任务日志。
  • 如果只是容器映射问题,优先修 runtime 或 device plugin。
  • 如果宿主机也异常,不要反复拉起业务进程。
  • 频繁掉卡的节点应做硬件巡检或返修。

10. 多卡和拓扑排障

多卡服务除了单卡健康,还要看 GPU 之间、GPU 和网卡之间的距离。

常用命令:

nvidia-smi topo -m
nvidia-smi topo -p2p r
lspci -tv
numactl --hardware

重点看:

  • GPU 之间是 PCIe、NVLink 还是 NVSwitch。
  • P2P 是否可用。
  • GPU 是否跨 CPU socket 通信。
  • 网卡是否靠近参与 RDMA 的 GPU。
  • 多卡任务是否被调度到拓扑不合理的卡组。

典型问题:

  • 8 卡机器只用了拓扑距离很远的几张卡,通信慢。
  • GPU 和网卡跨 NUMA 节点,RDMA 性能差。
  • tensor parallel 跨了低速 PCIe 链路,吞吐不升反降。
  • 某张卡变慢,导致整个数据并行任务等待。

多卡性能排障不要只看总 GPU 数。卡的位置、互联方式和调度分组会直接影响训练 step time 和推理延迟。

11. CPU、内存、存储和网络也要一起看

很多看起来像 GPU 的问题,根因不在 GPU。

表现可能根因
GPU 利用率低CPU tokenizer 慢、数据加载慢、请求不足、网络等待
首次请求很慢模型冷加载、磁盘慢、权重未缓存
训练周期性卡顿checkpoint 写盘、数据集读取、网络同步
推理 P99 高队列堆积、长 prompt、日志阻塞、KV Cache 紧张
多副本扩容慢镜像太大、模型权重分发慢、对象存储带宽不足

建议同步采集:

top
free -h
df -h
iostat -x 1
ip -s link
ss -s

LLM 服务里 CPU 和系统内存经常被低估。tokenizer、请求解析、RAG 检索、日志、后处理和调度都可能发生在 CPU 侧。GPU 很贵,但它经常在等别的环节。

12. 告警建议

告警不要只按固定阈值写死,要结合趋势、持续时间和业务影响。

告警项建议判断
GPU 不可见任意生产 GPU 从监控中消失,立即告警
GPU 利用率异常低有流量或训练任务时持续低利用率,告警
显存接近上限持续高占用且剩余空间不足以覆盖突发,告警
OOM任意 OOM 计数增加,按服务等级告警
温度过高持续高温或出现 thermal throttle,告警
功耗/频率异常满载时频率明显低于基线,告警
ECC uncorrected立即告警并隔离节点
Xid记录所有 Xid,频繁或严重 Xid 立即告警
worker 重启GPU worker 异常重启次数增加,告警
P99 延迟恶化和硬件指标联动分析

告警需要避免两个极端:

  • 阈值太低,频繁误报,最后没人看。
  • 阈值太高,只在服务已经不可用时才报警。

更好的方式是建立基线。例如同一型号 GPU、同一模型、同一并发下,正常的 GPU 利用率、显存曲线、温度、功耗、TTFT 和 TPOT 大致是什么样。偏离基线比单个阈值更有诊断价值。

13. 排障流程

遇到线上硬件相关问题时,可以按下面顺序收敛。

13.1 先确认影响面

  1. 是单个请求、单个模型、单个实例,还是整个集群。
  2. 是训练、推理、模型加载,还是扩容阶段。
  3. 是平均延迟变差,还是 P99 变差。
  4. 是吞吐下降,还是错误率上升。
  5. 是否集中在某台机器、某张 GPU、某个模型版本。

13.2 再看硬件健康

nvidia-smi
nvidia-smi -L
nvidia-smi -q
dmesg -T | grep -i xid

关注:

  • GPU 是否全部可见。
  • 是否有 ECC 或 Xid。
  • 温度和功耗是否异常。
  • 显存是否被意外进程占用。
  • 驱动和 CUDA 版本是否变化。

13.3 然后看资源瓶颈

现象优先检查
OOM显存、KV Cache、请求长度、并发、其他进程
GPU 利用率低CPU、数据加载、tokenizer、网络、batch
GPU 利用率高但慢显存带宽、队列、batch、P99 长请求
多卡慢拓扑、NCCL、NVLink / PCIe、NUMA、网卡位置
运行一段时间后变慢显存碎片、日志、缓存、温度、泄漏

13.4 最后做复现和隔离

  • 用相同模型、相同输入长度、相同并发复现。
  • 对比健康节点和异常节点。
  • 单卡任务和多卡任务分开测试。
  • 业务流量和硬件压测分开测试。
  • 异常节点先隔离,避免继续污染线上结果。

14. 常见场景速查

问题快速判断常见处理
模型启动 OOM权重和显存余量不匹配量化、换卡、多卡切分、减小模型
长上下文 OOMKV Cache 增长过快限制上下文、降低并发、KV Cache 优化
GPU 利用率低GPU 在等 CPU / IO / 网络 / 请求查 tokenizer、数据加载、batch 和队列
P99 延迟高长尾请求或队列堆积限流、分级调度、拆分长短请求
训练 hang某节点或通信异常查 NCCL、Xid、网络、掉卡
吞吐突然下降降频、温度、功耗或某实例异常查温度、clock、power、worker 日志
nvidia-smi 无卡驱动或硬件异常lspci、内核日志、驱动模块
单机正常多机慢网络或拓扑问题跑 NCCL tests,查 RDMA / RoCE / IB

15. 上线检查清单

上线前建议确认:

  1. 每张 GPU 都有稳定 UUID 标签。
  2. DCGM 或等价采集已经接入监控。
  3. 服务指标和 GPU 指标能按实例关联。
  4. 已经用真实输入长度和并发压测。
  5. 已知 OOM 边界和降级策略。
  6. 已配置最大输入、最大输出和最大并发限制。
  7. 已有 ECC、Xid、掉卡和 worker 重启告警。
  8. 多卡服务已经验证拓扑和 NCCL 性能。
  9. 模型权重、镜像和缓存路径不会拖慢扩容。
  10. 异常节点有隔离和恢复流程。

16. 总结

硬件监控不是单独看 GPU 利用率,而是把模型、请求、推理框架、GPU、显存、CPU、存储、网络和调度放在一起看。

业务异常
-> 定位模型 / 实例 / 节点 / GPU
-> 查看显存、利用率、温度、功耗、ECC、Xid
-> 关联请求长度、并发、队列、KV Cache
-> 区分 GPU 问题、系统问题和调度问题
-> 隔离、复现、修复、建立告警

真正可靠的 LLM 部署,需要在上线前知道资源边界,在运行中持续记录硬件状态,在故障时能快速把“哪张卡、哪个进程、哪个请求、哪个时间点”串起来。这样排障才不会停留在重启服务和猜测原因。