性能分析工具入门:使用 nvidia-smi、top、htop 监控系统资源,定位性能瓶颈
训练跑得慢,第一反应是什么?
我个人的习惯是——先看资源用满了没有。别急着调代码,先搞清楚是GPU在偷懒,还是CPU在拖后腿。说白了,性能分析的第一步,就是学会「看仪表盘」。
为什么先学工具?
你想想看,一个医生看病,总得先量体温、测血压吧?性能优化也一样。nvidia-smi、top、htop 就是我们的体温计和血压计。它们告诉你:
- GPU 利用率高不高?
- 显存是不是爆了?
- CPU 是不是在空转?
- 内存够不够用?
我在项目中遇到过好几次,团队花了一周优化模型结构,结果发现是数据加载线程数设少了,GPU 一直在等数据。嗯,工具看一眼就能发现的问题,硬是折腾了一周。
核心原则:先看资源,再调代码。不要凭感觉优化。
nvidia-smi:GPU 的「体检报告」
这是 NVIDIA 官方提供的命令行工具。装上驱动就能用,不需要额外安装。
# 最基础的用法
nvidia-smi
# 持续监控,每秒刷新一次
nvidia-smi -l 1
# 只看关键信息,简洁模式
nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used --format=csv
输出长这样(我简化了一下):
| 字段 | 含义 | 正常范围 |
|---|---|---|
| GPU-Util | GPU 计算单元利用率 | 训练时应 > 80% |
| Memory-Usage | 显存使用量 | 不要超过 90% |
| Temp | GPU 温度 | 一般 < 85°C |
| Volatile GPU-Util | 瞬时利用率 | 波动大说明有瓶颈 |
我的小技巧:用
watch -n 1 nvidia-smi 替代 -l 1,因为 watch 可以高亮显示变化的值,更容易发现异常波动。
top:CPU 和内存的「快照」
top 是 Linux 自带的进程监控工具。虽然界面有点老,但够用。
# 直接运行
top
# 按 CPU 使用率排序(进入 top 后按 P)
# 按内存使用率排序(进入 top 后按 M)
重点关注这几个指标:
- %CPU:单个进程的 CPU 占用。训练时如果 GPU 利用率低,但 CPU 跑满,说明数据加载或预处理是瓶颈。
- %MEM:内存占用。如果接近 100%,系统会开始用 swap,性能断崖式下跌。
- load average:系统负载。三个数字分别对应 1分钟、5分钟、15分钟的平均负载。如果远大于 CPU 核心数,说明系统过载。
注意:top 显示的 CPU 利用率是所有核心的平均值。如果你的机器有 64 核,一个进程占满 1 核,显示只有 1.5% 左右。别被这个数字骗了。
htop:top 的「可视化升级版」
我个人更喜欢 htop。它比 top 直观得多,而且支持鼠标操作。
# 安装(Ubuntu/Debian)
sudo apt install htop
# 运行
htop
htop 的几个杀手锏:
- 彩色显示:CPU 核心各自独立显示,一眼看出是不是单核瓶颈。
- 树形视图:按 F5 可以看进程的父子关系,方便找到「谁启动了谁」。
- 垂直/水平滚动:进程列表可以滚动,环境变量也能看。
- 搜索和过滤:按 F3 搜索进程名,按 F4 过滤,找特定进程很快。
我曾经排查过一个诡异的问题:GPU 利用率忽高忽低,但 CPU 看起来也不忙。用 htop 的树形视图一看,发现数据加载进程被系统 OOM killer 反复杀掉又重启。嗯,内存不够,系统在「杀进程保平安」。
实战:定位性能瓶颈的「三步法」
光会看工具还不够,得知道怎么看。我总结了一个简单的流程:
- 看 GPU 利用率:如果 < 80%,说明 GPU 在等数据。问题可能在 CPU、磁盘 IO 或网络。
- 看 CPU 利用率:如果 CPU 跑满(尤其是单核跑满),说明数据预处理或 Python 解释器开销是瓶颈。
- 看内存和显存:如果接近上限,考虑减小 batch size 或优化内存管理。
一个典型场景:GPU 利用率 30%,CPU 利用率 100%,内存正常。这基本就是数据加载线程数不够,或者数据预处理太慢。解决方案:增加 num_workers,或者用更快的 IO 方式(比如从 HDD 换到 SSD)。
用 SVG 画一张「性能分析知识地图」
下面这张图,帮你把今天讲的内容串起来:
避坑指南
我曾经犯过几个错,写出来给你提个醒:
- 只看 GPU 利用率:有一次 GPU 利用率 95%,我以为没问题。结果一看显存,已经 99% 了,随时可能 OOM。利用率高不代表健康。
- 忽略温度:GPU 温度超过 85°C 会主动降频。我见过一台机器,散热坏了,GPU 利用率只有 40%,但温度 90°C。降频了,跑再快也没用。
- top 看 CPU 只看 %CPU:前面说了,多核机器上 %CPU 会稀释。用 htop 看每个核心的独立利用率更靠谱。
日常习惯:我每次开始训练,都会开三个终端窗口:一个跑 nvidia-smi -l 1,一个跑 htop,一个跑训练脚本。这样资源变化一目了然。
好了,工具就介绍到这里。记住,性能分析不是玄学,是科学。用数据说话,用工具定位。下一章我们会深入聊「如何用这些工具找到具体的代码瓶颈」,到时候会结合 Python 的 profiler 一起用。
想要更多资料,联系可可