性能分析工具入门:使用 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 反复杀掉又重启。嗯,内存不够,系统在「杀进程保平安」。

实战:定位性能瓶颈的「三步法」

光会看工具还不够,得知道怎么看。我总结了一个简单的流程:

  1. 看 GPU 利用率:如果 < 80%,说明 GPU 在等数据。问题可能在 CPU、磁盘 IO 或网络。
  2. 看 CPU 利用率:如果 CPU 跑满(尤其是单核跑满),说明数据预处理或 Python 解释器开销是瓶颈。
  3. 看内存和显存:如果接近上限,考虑减小 batch size 或优化内存管理。
一个典型场景:GPU 利用率 30%,CPU 利用率 100%,内存正常。这基本就是数据加载线程数不够,或者数据预处理太慢。解决方案:增加 num_workers,或者用更快的 IO 方式(比如从 HDD 换到 SSD)。

用 SVG 画一张「性能分析知识地图」

下面这张图,帮你把今天讲的内容串起来:

性能分析工具入门:知识体系 nvidia-smi GPU 利用率 / 显存 / 温度 top CPU / 内存 / 负载 htop 彩色 / 树形 / 交互 GPU-Util < 80% → 瓶颈 CPU 跑满 → 数据加载慢 树形视图 → 找父子进程 定位瓶颈 → 针对性优化

避坑指南

我曾经犯过几个错,写出来给你提个醒:

  • 只看 GPU 利用率:有一次 GPU 利用率 95%,我以为没问题。结果一看显存,已经 99% 了,随时可能 OOM。利用率高不代表健康。
  • 忽略温度:GPU 温度超过 85°C 会主动降频。我见过一台机器,散热坏了,GPU 利用率只有 40%,但温度 90°C。降频了,跑再快也没用。
  • top 看 CPU 只看 %CPU:前面说了,多核机器上 %CPU 会稀释。用 htop 看每个核心的独立利用率更靠谱。
日常习惯:我每次开始训练,都会开三个终端窗口:一个跑 nvidia-smi -l 1,一个跑 htop,一个跑训练脚本。这样资源变化一目了然。

好了,工具就介绍到这里。记住,性能分析不是玄学,是科学。用数据说话,用工具定位。下一章我们会深入聊「如何用这些工具找到具体的代码瓶颈」,到时候会结合 Python 的 profiler 一起用。

想要更多资料,联系可可