2、系统监控工具:top/htop、nvidia-smi、iostat、vmstat、netstat 实战

训练跑不动了,第一反应是什么?

我猜很多人会直接看日志,找报错。但说实话,大部分性能瓶颈根本不会报错。它只会悄悄告诉你——CPU 满了、GPU 在摸鱼、磁盘在排队、网络在堵车。

这时候,系统监控工具就是你的眼睛。我个人习惯,训练一开始就开四个终端,分别跑 top、nvidia-smi、iostat、vmstat。别嫌多,等你被坑过一次就懂了。

2.1 top / htop:CPU 与内存的实时快照

top 是 Linux 自带的,够用但丑。htop 是增强版,支持鼠标操作、颜色高亮、树状进程。我建议你直接装 htop,省眼力。

跑训练时,重点关注这几个指标:

  • %CPU:单个进程的 CPU 占用。如果模型不复杂,但 CPU 吃满,说明 DataLoader 在拖后腿。
  • %MEM:内存占用。别让 swap 飙起来,否则训练直接变蜗牛。
  • LOAD:系统负载。如果 load 远高于 CPU 核心数,说明有进程在抢资源。

实战命令:

# 实时监控,按 CPU 排序
top -o %CPU

# htop 更友好
htop

我的经验:有一次训练 loss 降不下去,查了半天发现是 CPU 被另一个日志进程占满了。DataLoader 拿不到 CPU 时间片,GPU 一直在空转。用 htop 一眼就看到了那个吃 CPU 的罪魁祸首。

2.2 nvidia-smi:GPU 状态全掌握

做深度学习,nvidia-smi 就是你的仪表盘。我每天至少看它几十次。

关键字段:

  • Volatile GPU-Util:GPU 利用率。理想值在 90% 以上。低于 80% 就要警惕了。
  • Memory-Usage:显存占用。如果接近上限,考虑梯度检查点或混合精度。
  • Temp:温度。超过 85°C 会降频,性能直接打七折。

常用命令:

# 每秒刷新一次
watch -n 1 nvidia-smi

# 只看关键信息
nvidia-smi --query-gpu=utilization.gpu,memory.used,temperature.gpu --format=csv

避坑指南:我曾经遇到过 GPU-Util 显示 100%,但训练速度就是上不去。后来发现是显存带宽瓶颈——数据在显存里搬来搬去,计算单元反而在等数据。这时候要看 nvidia-smi dmon 里的带宽利用率。

2.3 iostat:磁盘 I/O 的照妖镜

很多人忽略磁盘,但数据加载慢的时候,磁盘就是第一嫌疑人。

重点关注:

  • %util:磁盘繁忙度。接近 100% 说明磁盘在排队。
  • r/s, w/s:每秒读写次数。太高说明小文件太多。
  • await:平均 I/O 等待时间。超过 10ms 就要优化了。

实战命令:

# 监控所有磁盘,每秒刷新
iostat -x 1

# 只看某个磁盘
iostat -x sda 1

我的经验:有一次训练数据是几万张小图片,iostat 显示 %util 一直在 95% 以上。后来改成 TFRecord 格式,%util 直接降到 20%。你想想看,磁盘不忙了,GPU 自然就吃饱了。

2.4 vmstat:系统整体健康检查

vmstat 是系统级别的快照,帮你快速判断瓶颈在 CPU、内存还是 I/O。

字段 含义 警戒线
r 运行队列中的进程数 大于 CPU 核心数
si, so swap 换入换出 大于 0 就要注意
us, sy 用户态和内核态 CPU 时间 sy 超过 30% 说明系统调用太多
wa 等待 I/O 的时间 超过 20% 说明磁盘是瓶颈

常用命令:

# 每秒采样一次,共 5 次
vmstat 1 5

注意:如果 si 和 so 持续非零,说明物理内存不够了。我曾经在 32GB 的机器上跑 64GB 的数据集,结果 swap 疯狂读写,训练速度从 100 it/s 掉到 5 it/s。加内存或者换更小的 batch size 吧。

2.5 netstat:网络连接诊断

分布式训练时,网络就是生命线。netstat 帮你检查连接状态。

关键指标:

  • Recv-Q, Send-Q:接收和发送队列。如果持续非零,说明网络有瓶颈。
  • State:连接状态。ESTABLISHED 是正常的,大量 TIME_WAIT 说明连接没释放。

实战命令:

# 查看所有 TCP 连接
netstat -ant

# 只看监听端口
netstat -tlnp

# 统计连接状态
netstat -ant | awk '{print $6}' | sort | uniq -c

我的经验:有一次分布式训练,一台机器总是比其他机器慢半拍。用 netstat 一看,发现它的 Recv-Q 一直在 1000 以上。原来是网卡协商成了百兆模式,改成千兆后问题解决。嗯,硬件坑有时候比软件坑还隐蔽。

2.6 知识体系总览

下面这张图总结了我们今天聊的五个工具,以及它们各自盯什么指标。你可以把它贴在工位旁边,排查问题时按图索骥。

系统监控工具知识体系 top / htop CPU 占用 · 内存 · 负载 nvidia-smi GPU 利用率 · 显存 · 温度 iostat 磁盘 I/O · 等待时间 · 利用率 vmstat 运行队列 · swap · 系统调用 netstat 网络连接 · 队列 · 状态统计 排查思路 GPU 利用率低 → 看 CPU 是否满载 → 看磁盘 I/O 是否排队 → 看内存是否 swap → 看网络是否丢包 五个工具轮流看,瓶颈无处可藏

2.7 实战排查流程

当你发现训练变慢了,别慌。按这个顺序查:

  1. 先看 nvidia-smi:GPU 利用率是不是低于 90%?如果是,继续往下查。
  2. 再看 top/htop:CPU 是不是被其他进程占满了?DataLoader 的 worker 够不够?
  3. 然后看 iostat:磁盘 %util 高不高?await 长不长?
  4. 接着看 vmstat:swap 有没有在换入换出?运行队列是不是太长?
  5. 最后看 netstat:如果是分布式训练,检查连接状态和队列长度。

一句话总结:系统监控不是玄学,是科学。每个工具盯一个维度,组合起来就能定位 90% 的性能瓶颈。我这些年踩过的坑,十有八九都是靠这几个工具揪出来的。

小技巧:把上面五个命令写成一个脚本,训练时后台跑,每 10 秒记录一次。出问题了直接翻日志,不用重新复现。我管这叫「黑匣子」,谁用谁知道。

好了,工具都认识了。下一章我们聊聊怎么用这些工具真正定位到训练瓶颈——嗯,到时候会拿一个真实案例手把手带你走一遍。

想要更多资料,联系可可