3、基础命令与监控:dmesg、top、free、vmstat、iostat 等系统监控命令的使用与解读

做瑞芯微平台稳定性测试,说白了就是跟这几个命令打交道。我刚开始接触RK3588时,总觉得压力测试就是跑个分,后来发现真正的问题往往藏在系统日志和资源监控里。今天咱们就把这几个看家本领捋一遍。

3.1 dmesg:系统日志的“第一现场”

dmesg 命令,我个人习惯叫它“系统日记本”。内核启动、驱动加载、硬件报错,全记在这里。做压力测试时,这是第一个要盯住的窗口。

核心用法:

# 查看所有内核日志
dmesg

# 实时监控新日志(类似 tail -f)
dmesg -w

# 只看错误和警告
dmesg -l err,warn

# 清空日志(测试前建议做一次)
dmesg -c

我在项目中遇到过一件事:RK3566 跑 4K 视频解码,半小时后画面卡死。用 dmesg -w 实时盯着,发现每隔几分钟就蹦出一条 vpu: firmware timeout。嗯,这就是 VPU 固件超时了,后来调整了电压才解决。

我的习惯:每次开始压力测试前,先执行 dmesg -c 清空日志。这样测试过程中出现的新问题一目了然,不会被旧日志淹没。

3.2 top:进程的“实时体检报告”

top 命令,说白了就是看哪个进程在“吃”CPU。在瑞芯微平台上,我特别关注 %CPU%MEM 这两列。

常用操作:

# 启动 top
top

# 按 CPU 使用率排序(默认就是)
# 按内存使用率排序
M

# 显示每个 CPU 核心的负载
1

# 只看某个进程
top -p PID

你想想看,如果某个进程的 CPU 占用率一直 100%,而它又不是你的测试程序,那八成是驱动有问题。我曾经在 RK3399 上遇到 irq/142-mmc0 这个内核线程吃掉 30% CPU,查了半天发现是 SD 卡驱动的中断处理写得有问题。

注意:top 显示的 CPU 占用率是累加值。多核处理器上,一个进程占满一个核,显示的是 100%。如果 8 个核全占满,显示 800%。别被数字吓到。

3.3 free:内存的“水位线”

内存泄漏是嵌入式系统的常见病。free 命令能快速告诉你内存还剩多少。但要注意,Linux 的内存管理机制会让“可用内存”看起来比实际少。

关键参数:

# 以 MB 为单位显示
free -m

# 以 GB 为单位显示
free -g

# 持续监控(每 2 秒刷新一次)
free -s 2

看输出时,我主要关注 available 这一列。它才是真正可用的内存,包括可以回收的缓存和缓冲区。举个例子:

              total        used        free      shared  buff/cache   available
Mem:           7825        3200         800         200        3825        4200

这里 free 只有 800MB,但 available 有 4200MB。嗯,别慌,系统只是把内存拿去当缓存了,需要时会释放出来。

避坑指南:我曾经在 RK3288 上做 72 小时压力测试,每隔 1 小时记录一次 free -m 的 available 值。如果这个值持续下降且不反弹,基本可以断定有内存泄漏。用脚本自动记录,省心省力。

3.4 vmstat:系统瓶颈的“X光机”

vmstat 能同时看 CPU、内存、IO 三个维度的数据。我个人觉得它是性价比最高的监控命令——一行输出,信息量巨大。

标准用法:

# 每 2 秒输出一次,共输出 5 次
vmstat 2 5

输出示例:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 420000 12000 380000    0    0    10    20  100  200  5  3 90  2  0

我重点看这几列:

  • r(运行队列):如果这个值长期大于 CPU 核心数,说明 CPU 不够用了。
  • si/so(swap in/out):这两个值不为 0,说明内存不够,在频繁换页。嵌入式设备上出现这个,基本可以判死刑了。
  • wa(IO等待):超过 30% 就要警惕,可能是存储性能瓶颈。

我记得有一次调试 RK3588 的 NVMe 驱动,wa 值飙到 60%,系统卡得不行。后来发现是 PCIe 链路协商出了问题,速率只有 Gen1。

3.5 iostat:存储性能的“秒表”

做压力测试时,存储往往是第一个扛不住的。iostat 能精确告诉你磁盘的读写速度、IOPS 和等待时间。

常用参数:

# 安装(Debian/Ubuntu)
apt install sysstat

# 每 2 秒输出一次,只看设备信息
iostat -x 2

# 只看某个设备
iostat -x sda 2

输出中我重点关注:

  • %util:磁盘利用率。接近 100% 说明磁盘已经满负荷了。
  • await:平均 IO 等待时间(毫秒)。超过 100ms 就太慢了。
  • svctm:服务时间。如果这个值远小于 await,说明 IO 在排队。

注意:eMMC 和 NVMe 的 IO 特性完全不同。eMMC 的随机写性能很差,iostat 上会看到 await 很高。这不是故障,是硬件特性。做压力测试时,要针对不同存储介质设置不同的阈值。

3.6 实战:组合监控脚本

光会单个命令不够,得把它们串起来用。我写了个简单的监控脚本,做压力测试时必开:

#!/bin/bash
# 瑞芯微平台压力测试监控脚本
# 保存为 monitor.sh

LOG_DIR="/data/monitor_logs"
mkdir -p $LOG_DIR

# 记录开始时间
echo "=== 监控开始:$(date) ===" >> $LOG_DIR/summary.log

# 后台启动各个监控
dmesg -w >> $LOG_DIR/dmesg.log &
DMESG_PID=$!

# 每 5 秒记录一次系统状态
while true; do
    echo "=== $(date) ===" >> $LOG_DIR/top.log
    top -b -n 1 | head -20 >> $LOG_DIR/top.log
    
    echo "=== $(date) ===" >> $LOG_DIR/memory.log
    free -m >> $LOG_DIR/memory.log
    
    echo "=== $(date) ===" >> $LOG_DIR/vmstat.log
    vmstat 1 1 | tail -1 >> $LOG_DIR/vmstat.log
    
    echo "=== $(date) ===" >> $LOG_DIR/iostat.log
    iostat -x 1 1 | tail -3 >> $LOG_DIR/iostat.log
    
    sleep 5
done

# 测试结束后,清理后台进程
kill $DMESG_PID

使用建议:把这个脚本放在后台运行,然后开始你的压力测试。测试结束后,查看 dmesg.log 里有没有错误,memory.log 里内存有没有持续下降。我曾经用这个脚本抓到过一个很隐蔽的 DMA 内存泄漏,驱动每次申请 4KB 但只释放 2KB,跑了 12 小时才暴露出来。

3.7 总结

这几个命令,说白了就是你的“五感”。dmesg 是耳朵,听系统有没有报错;top 是眼睛,看谁在吃资源;free 是体温计,量内存够不够;vmstat 是 X 光,看内部瓶颈;iostat 是秒表,测存储性能。

做瑞芯微平台稳定性测试,别一上来就跑分。先开监控,再跑压力。发现问题,定位问题,解决问题——这才是实战该有的节奏。