4. CPU 压力测试:使用 stress 工具进行 CPU 满载测试,观察频率、温度与功耗
各位做瑞芯微平台的朋友,大家好。今天我们来聊聊 CPU 压力测试。
说实话,CPU 满载测试是稳定性验证里最基础、也最容易被忽视的一环。我见过不少项目,跑个应用觉得没问题就出货了,结果一到高温环境或者多任务场景,系统直接死给你看。嗯,这其实是可以避免的。
今天我们就用 stress 这个轻量级工具,把 CPU 压到 100%,然后盯着频率、温度和功耗这三个关键指标。你想想看,这三者就像三兄弟,一个动,另外两个肯定跟着变。
4.1 为什么用 stress 而不是其他工具?
市面上 CPU 压力工具不少,比如 stress-ng、sysbench、cpuburn。但我个人习惯先用 stress,原因很简单:
- 够轻量:一个命令搞定,不需要额外依赖
- 够直接:就是纯 CPU 计算,不掺杂内存或 I/O 干扰
- 够可控:可以指定用几个核、压多久
当然,如果你要做更细粒度的测试,比如浮点运算、缓存压力,那 stress-ng 会更合适。但今天我们先从最基础的开始。
apt install stress 或者自己交叉编译。我建议直接编进根文件系统,省得到现场才发现没工具。
4.2 基础命令:让 CPU 跑满
先来个最简单的。假设你的板子是 4 核 CPU,想全部跑满:
# 启动 4 个 worker,每个 worker 跑一个 CPU 密集任务
stress --cpu 4 --timeout 60s
这条命令会让 4 个核都跑到 100%。你可以在另一个终端用 top 或 htop 确认:
top -d 1 | grep "CPU"
正常情况下,你会看到 CPU 占用率接近 100%。
但这里有个坑——瑞芯微的 CPU 有大小核架构。比如 RK3588 是 4 个 A76 大核 + 4 个 A55 小核。如果你只跑 stress --cpu 4,系统可能会把任务优先分配给小核。你想想看,这能测出真正的极限吗?
taskset 绑定大核。比如只压 A76 大核:taskset -c 4-7 stress --cpu 4 --timeout 60s。我曾经在 RK3588 上踩过这个坑,以为压满了,结果大核在摸鱼。
4.3 观察频率:别被表面数字骗了
跑满 CPU 只是第一步。关键是要看实际频率。瑞芯微的 DVFS(动态调频调压)机制很积极,温度一高就降频。你看到的 100% 占用率,可能实际频率已经掉了一半。
怎么看实时频率?我推荐两种方式:
- 读 sysfs 节点:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq - 用 debugfs:
cat /sys/kernel/debug/clk/clk_summary | grep cpu
我个人习惯用第一种,简单直接。比如:
watch -n 1 'cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq'
你会看到类似这样的输出:
1800000
1800000
1800000
1800000
1200000
1200000
1200000
1200000
前四个是大核,跑在 1.8GHz;后四个是小核,跑在 1.2GHz。如果温度升高,你会发现大核频率开始往下掉——1.6GHz、1.2GHz、甚至 800MHz。
4.4 温度监控:别让芯片烧了
频率掉下来,多半是温度惹的祸。瑞芯微芯片内部有温度传感器,通常暴露在 /sys/class/thermal/ 下。
查看当前温度:
cat /sys/class/thermal/thermal_zone0/temp
注意,这个值通常是毫摄氏度。比如输出 75000,就是 75°C。
我一般会写个简单脚本,同时监控频率和温度:
#!/bin/bash
while true; do
echo "=== $(date) ==="
echo "温度: $(cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}')°C"
echo "频率:"
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
sleep 2
done
跑 stress 时,温度会快速上升。以 RK3588 为例,室温下空载大概 40-50°C,满载后几分钟内就能冲到 80-90°C。如果超过 100°C,芯片就会触发硬件保护,直接降频甚至关机。
4.5 功耗测量:算算你的电源够不够
频率和温度都看了,功耗怎么测?
最准的方法是用电流钳或者功率计测整板功耗。但如果你手头没有硬件工具,也可以从软件层面估算。
瑞芯微的 PMIC(电源管理芯片)通常提供电流读数。比如 RK3588 的 rk806 PMIC,可以通过 i2c 读取:
i2cget -y 0 0x20 0x1c w
但这个比较麻烦,我一般用另一种方式——看电池或者供电轨的电压电流。如果你的板子有电池,可以读 /sys/class/power_supply/battery/ 下的节点。
更简单的办法:用 perf 统计 CPU 的能耗模型。瑞芯微内核里通常有 energy_model 支持:
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_model
这个值可以帮你估算每个频率点下的功耗。虽然不如硬件测量准,但做对比测试足够了。
4.6 实战:一次完整的压力测试流程
好了,理论说完了,我们来走一遍完整的流程。假设你手头是一块 RK3588 开发板:
- 准备工作:装好散热器,接上电源,串口或 SSH 登录
- 查看初始状态:记录空载时的频率、温度、功耗
- 启动压力:
taskset -c 4-7 stress --cpu 4 --timeout 300s - 实时监控:用上面的脚本同时看频率和温度变化
- 记录数据:每 10 秒记录一次,持续 5 分钟
- 分析结果:看频率是否稳定、温度是否超过 85°C、功耗是否在电源范围内
如果发现频率掉得厉害,比如从 1.8GHz 掉到 1.2GHz,那就要检查散热或者供电了。我遇到过一块板子,散热片没贴紧,结果温度冲到 95°C,频率直接锁在 800MHz。重新涂了导热硅脂后,问题解决。
4.7 常见问题与避坑
- stress 跑不起来? 检查是否装了 stress,或者用
stress --version确认版本。有些旧版 stress 不支持--timeout参数。 - 频率不降但温度很高? 可能是温度传感器读数不准,或者温控阈值设置太高。可以查
/sys/class/thermal/thermal_zone0/trip_point_*_temp看阈值。 - 功耗测出来不对? 软件估算仅供参考。真想准,买个 USB 功率计,几十块钱,比啥都靠谱。
下一章我们会讲内存压力测试,到时候用 memtester 和 stress-ng 来折腾 DDR。嗯,那个坑更多,到时候细聊。