3. 显存监控工具
做压测这么多年,我见过太多人一上来就开跑,结果显存爆了都不知道怎么查。说实话,显存监控这事,比你想象的重要得多。你想想看,模型推理时显存突然飙到 23.8GB,你以为是正常波动,其实是内存泄漏的前兆。今天我就把这三件趁手的兵器给你讲透。
3.1 nvidia-smi:最基础的显存侦察兵
nvidia-smi 是 NVIDIA 官方自带的工具,装完驱动就有。我个人习惯,压测开始前先跑一遍 nvidia-smi -l 1,每秒刷新一次,心里有个底。
常用参数速查
| 参数 | 作用 | 我的用法 |
|---|---|---|
-l 秒数 |
设置刷新间隔 | -l 2 两秒一刷,不占资源 |
--query-gpu=... |
查询指定字段 | 写脚本抓数据时必用 |
--format=csv |
输出为 CSV | 配合 grep/awk 做自动化 |
-i GPU编号 |
指定某张卡 | 多卡环境,我只盯 0 号卡 |
核心字段解读
- Memory-Usage:显存使用量,单位 MiB。注意看的是
Used不是Free - Volatile GPU-Util:GPU 利用率百分比。我遇到过利用率 100% 但显存没满的情况,那是计算瓶颈
- Temp:温度。超过 85°C 就要警惕了,我曾经因为散热问题导致压测结果忽高忽低
我的小技巧
用 watch -n 1 nvidia-smi 替代 -l 参数,可以同时看到历史变化。嗯,这个习惯我用了五年。
实战:抓取显存峰值
# 每秒记录显存使用,持续 10 分钟
for i in $(seq 1 600); do
nvidia-smi --query-gpu=memory.used --format=csv,noheader >> mem_log.csv
sleep 1
done
# 找出最大值
sort -n mem_log.csv | tail -1
这段脚本我每次压测都会跑。有一次线上服务半夜挂了,第二天查日志,发现显存在凌晨 3 点突然从 12GB 跳到 24GB,然后 OOM 了。没有这个日志,你根本不知道问题出在哪。
3.2 nvtop:可视化显存监控
nvidia-smi 虽然好用,但信息太散。nvtop 就像 GPU 版的 htop,一眼能看到所有进程的显存占用。我第一次用的时候,心想:这才是人看的工具啊。
安装方式
# Ubuntu / Debian
sudo apt install nvtop
# CentOS / RHEL
sudo yum install nvtop
# 或者从源码编译
git clone https://github.com/Syllo/nvtop.git
mkdir build && cd build
cmake ..
make
sudo make install
注意
nvtop 依赖 libdrm 和 libncurses。我在 CentOS 7 上踩过坑,编译时缺依赖,折腾了半小时。建议直接用包管理器装。
界面解读
启动后你会看到三个区域:
- 顶部:全局 GPU 利用率、显存总量、温度、风扇转速
- 中间:每个 GPU 的实时曲线图,按
F2可以切换指标 - 底部:每个进程的 PID、用户、显存占用、GPU 利用率
我最常用的是按 M 键按显存排序。压测时盯着底部列表,哪个进程突然暴涨,一眼就能揪出来。
避坑指南
我曾经在压测时发现一个进程显存持续增长,但 nvidia-smi 看不出来,因为总显存没变。用 nvtop 按进程排序才发现,有个子进程在偷偷申请显存,每次推理完不释放。嗯,这就是内存泄漏的典型特征。
3.3 dcgm-exporter:企业级监控部署
如果你要监控几十台机器的 GPU,nvidia-smi 和 nvtop 就不够用了。dcgm-exporter 是 NVIDIA 官方出的 Prometheus exporter,专门干这个的。
部署步骤
# 1. 拉取镜像
docker pull nvidia/dcgm-exporter:latest
# 2. 启动容器
docker run -d \
--name dcgm-exporter \
--gpus all \
-p 9400:9400 \
nvidia/dcgm-exporter:latest
# 3. 验证
curl http://localhost:9400/metrics | grep -i "gpu"
部署完以后,Prometheus 配置里加上这个 target,Grafana 导入官方仪表盘,就能看到完整的 GPU 监控面板了。
关键指标说明
| 指标名 | 含义 | 告警阈值建议 |
|---|---|---|
DCGM_FI_DEV_MEM_COPY_UTIL |
显存带宽利用率 | > 80% 持续 5 分钟 |
DCGM_FI_DEV_GPU_UTIL |
GPU 计算单元利用率 | > 95% 持续 10 分钟 |
DCGM_FI_DEV_FB_USED |
显存已用量 | > 90% 立即告警 |
DCGM_FI_DEV_TEMPERATURE |
GPU 温度 | > 85°C 告警 |
我的部署经验
dcgm-exporter 默认暴露的指标有 100 多个,但大部分你用不上。我建议在 Prometheus 端做一次 relabel,只保留上面表格里的 4 个核心指标,能省不少存储空间。曾经有个项目,一个月存了 200GB 的 GPU 指标数据,90% 都是没用的。
3.4 三款工具对比
| 工具 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| nvidia-smi | 单机快速排查 | 零依赖,随装随用 | 信息分散,不适合长期监控 |
| nvtop | 实时可视化监控 | 进程级显存查看,直观 | 不支持远程,无历史数据 |
| dcgm-exporter | 集群监控、告警 | 指标丰富,可集成 Prometheus | 部署稍复杂,需要维护 |
我个人习惯是:日常调试用 nvtop,压测时后台跑 nvidia-smi 记录日志,生产环境上 dcgm-exporter + Grafana 面板。三件套配合使用,基本没有抓不到的显存问题。
最后说一句
工具再好,也得会用。我见过有人把 dcgm-exporter 部署好了,但告警阈值设成 99%,结果显存爆了都没收到通知。记住:监控的目的是发现问题,不是证明系统没问题。