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 知识体系总览
下面这张图总结了我们今天聊的五个工具,以及它们各自盯什么指标。你可以把它贴在工位旁边,排查问题时按图索骥。
2.7 实战排查流程
当你发现训练变慢了,别慌。按这个顺序查:
- 先看 nvidia-smi:GPU 利用率是不是低于 90%?如果是,继续往下查。
- 再看 top/htop:CPU 是不是被其他进程占满了?DataLoader 的 worker 够不够?
- 然后看 iostat:磁盘 %util 高不高?await 长不长?
- 接着看 vmstat:swap 有没有在换入换出?运行队列是不是太长?
- 最后看 netstat:如果是分布式训练,检查连接状态和队列长度。
一句话总结:系统监控不是玄学,是科学。每个工具盯一个维度,组合起来就能定位 90% 的性能瓶颈。我这些年踩过的坑,十有八九都是靠这几个工具揪出来的。
小技巧:把上面五个命令写成一个脚本,训练时后台跑,每 10 秒记录一次。出问题了直接翻日志,不用重新复现。我管这叫「黑匣子」,谁用谁知道。
好了,工具都认识了。下一章我们聊聊怎么用这些工具真正定位到训练瓶颈——嗯,到时候会拿一个真实案例手把手带你走一遍。
想要更多资料,联系可可