3、系统监控基础:使用tegrastats工具实时查看CPU/GPU/内存/温度状态

做嵌入式开发,尤其是跟Jetson打交道,我最怕什么?不是代码写不出来,而是板子跑着跑着突然卡死,或者莫名其妙地重启。你想想看,一个模型推理到一半,系统挂了,连个日志都没留下,那才叫抓狂。

所以,学会监控系统状态,是每个Jetson开发者的基本功。今天我们就来聊聊tegrastats这个工具。说实话,我刚开始用Jetson的时候,也试过用top、htop这些通用工具,但总觉得差点意思。直到发现了tegrastats,才感觉找到了“知己”。

3.1 tegrastats是什么?

tegrastats是NVIDIA官方为Jetson系列开发板量身定做的一个命令行监控工具。它可以直接读取硬件寄存器,获取CPU、GPU、内存、温度、电源等最底层的数据。

说白了,它就是Jetson的“体检报告”。而且,它是实时刷新的,每秒输出一行状态信息。

核心价值: 相比top、htop等通用工具,tegrastats能直接看到GPU利用率、GPU温度、内存带宽这些Jetson特有的指标。这些数据对性能调优至关重要。

3.2 基本用法

打开终端,直接输入命令就行:

sudo tegrastats

嗯,这里要注意,必须加sudo。我第一次用的时候没加,结果提示权限不足,还以为是工具没装好。后来才发现,读取硬件寄存器需要root权限。

运行后,你会看到类似这样的输出(每秒刷新一行):

RAM 3925/7851MB (lfb 1926MB) CPU [0%@1400,0%@1400,0%@1400,0%@1400,0%@1400,0%@1400] EMC_FREQ 0%@1600 GR3D_FREQ 0%@1147 APE 25 MTS fg 0% bg 0% PLL@48.5C MCPU@49.5C PMIC@100C Tboard@42.5C Tdiode@45.5C VDD_IN 3500/3500 VDD_CPU 0/0 VDD_GPU 0/0 VDD_SOC 0/0

第一次看到这串东西,是不是有点懵?别急,我们一个一个拆开看。

3.3 输出字段详解

我把常用的几个字段整理成了表格,方便你对照查看:

字段 含义 我的关注点
RAM 内存使用情况(已用/总容量,剩余可用) 如果lfb(剩余)持续低于500MB,就要小心了
CPU 每个CPU核心的利用率(%)和当前频率(MHz) 看有没有核心一直跑在100%,那可能是瓶颈
GR3D_FREQ GPU利用率(%)和当前频率(MHz) 这个最重要!GPU利用率上不去,说明CPU或内存带宽拖后腿了
EMC_FREQ 内存控制器频率(MHz) 内存带宽是否跑满,看这个
PLL / MCPU / Tboard / Tdiode 不同位置的温度传感器读数(单位:℃) 超过85℃就要注意散热了,我见过板子到90℃直接降频
VDD_IN / VDD_CPU / VDD_GPU 各模块的电压和电流 功耗异常时排查用

我的小技巧: 我习惯把tegrastats的输出重定向到一个文件里,方便事后分析。比如:

sudo tegrastats --interval 1000 > monitor.log 2>&1 &

这样它就在后台跑了,每秒记录一次,不影响你干别的活。

3.4 常用参数

tegrastats虽然简单,但也有一些实用参数。我挑几个常用的说说:

  • --interval:设置刷新间隔,单位是毫秒。默认是1000ms(1秒)。如果你想看更细粒度的数据,可以设成500ms:sudo tegrastats --interval 500
  • --logfile:直接输出到文件,省得自己重定向:sudo tegrastats --logfile mylog.txt
  • --start--stop:配合脚本使用,可以控制开始和结束时间。

我个人最常用的是--interval 1000,因为1秒一次,既能看到趋势,又不会产生太多数据。

3.5 实战:如何快速定位性能瓶颈?

光会看数据还不够,关键是怎么用。我分享一个我自己的排查流程:

  1. 先看温度:如果Tboard或PLL超过80℃,先别管别的,散热问题优先解决。我曾经在一个密闭机箱里跑模型,温度直接飙到95℃,系统自动降频,推理速度慢了3倍。
  2. 再看GPU利用率:如果GR3D_FREQ一直低于50%,说明GPU没喂饱。这时候要看CPU和内存带宽。
  3. 检查CPU:如果某个CPU核心一直100%,而GPU空闲,那很可能是CPU成了瓶颈。比如数据预处理太慢,GPU在等数据。
  4. 检查EMC_FREQ:如果内存频率跑满了,说明内存带宽不够。这时候可以考虑优化数据布局,或者减少内存拷贝。

避坑指南: 我曾经犯过一个错误——只看GPU利用率,觉得GPU跑满了就万事大吉。结果发现CPU在偷偷降频,导致整体吞吐量上不去。所以,一定要综合看CPU、GPU、内存、温度四个维度,缺一不可。

3.6 进阶:用tegrastats做压力测试

有时候,我们需要知道板子的极限在哪里。比如,新设计了一个散热方案,想知道能不能压住满负载。这时候,可以配合stress工具一起用:

# 先启动tegrastats监控
sudo tegrastats --interval 1000 --logfile stress_test.log &

# 然后启动压力测试
sudo stress --cpu 8 --io 4 --vm 2 --vm-bytes 1024M --timeout 60s

跑个60秒,然后看日志文件里的温度曲线。如果温度一直上升,没有稳定下来的趋势,那散热方案可能不够。

嗯,这里要提醒一下:压力测试时一定要盯着温度,别把板子烧了。我一般会在旁边放个小风扇,万一温度失控,赶紧手动停止。

3.7 小结

tegrastats虽然简单,但它是Jetson性能调优的“眼睛”。没有它,你就像在黑暗中摸索。我个人建议,把tegrastats的常用参数记在笔记本上,或者干脆写个脚本封装一下,每次调试时一键启动。

下一章,我们会聊到更高级的监控工具——NVIDIA的Nsight Systems。但在此之前,先把tegrastats用熟,你会发现很多性能问题其实一眼就能看出来。

一句话总结: 用tegrastats看温度、GPU利用率和内存带宽,这三个指标能帮你解决80%的性能问题。