4. CPU 压力测试:使用 stress 工具进行 CPU 满载测试,观察频率、温度与功耗

各位做瑞芯微平台的朋友,大家好。今天我们来聊聊 CPU 压力测试。

说实话,CPU 满载测试是稳定性验证里最基础、也最容易被忽视的一环。我见过不少项目,跑个应用觉得没问题就出货了,结果一到高温环境或者多任务场景,系统直接死给你看。嗯,这其实是可以避免的。

今天我们就用 stress 这个轻量级工具,把 CPU 压到 100%,然后盯着频率、温度和功耗这三个关键指标。你想想看,这三者就像三兄弟,一个动,另外两个肯定跟着变。

4.1 为什么用 stress 而不是其他工具?

市面上 CPU 压力工具不少,比如 stress-ngsysbenchcpuburn。但我个人习惯先用 stress,原因很简单:

  • 够轻量:一个命令搞定,不需要额外依赖
  • 够直接:就是纯 CPU 计算,不掺杂内存或 I/O 干扰
  • 够可控:可以指定用几个核、压多久

当然,如果你要做更细粒度的测试,比如浮点运算、缓存压力,那 stress-ng 会更合适。但今天我们先从最基础的开始。

小提示: 瑞芯微平台默认的 buildroot 或 Debian 系统里可能没预装 stress。你可以用 apt install stress 或者自己交叉编译。我建议直接编进根文件系统,省得到现场才发现没工具。

4.2 基础命令:让 CPU 跑满

先来个最简单的。假设你的板子是 4 核 CPU,想全部跑满:

# 启动 4 个 worker,每个 worker 跑一个 CPU 密集任务
stress --cpu 4 --timeout 60s

这条命令会让 4 个核都跑到 100%。你可以在另一个终端用 tophtop 确认:

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% 占用率,可能实际频率已经掉了一半。

怎么看实时频率?我推荐两种方式:

  1. 读 sysfs 节点cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
  2. 用 debugfscat /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,芯片就会触发硬件保护,直接降频甚至关机。

警告: 千万别在没散热片的情况下跑满载测试。我曾经在 RK3566 上试过,裸片跑 stress,温度直接飙到 110°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

这个值可以帮你估算每个频率点下的功耗。虽然不如硬件测量准,但做对比测试足够了。

我的经验: 在 RK3588 上,4 个大核满载跑 1.8GHz,整板功耗大概在 8-12W 之间。如果你的电源只能提供 5W,那肯定撑不住。所以做压力测试前,先确认电源适配器的规格。

4.6 实战:一次完整的压力测试流程

好了,理论说完了,我们来走一遍完整的流程。假设你手头是一块 RK3588 开发板:

  1. 准备工作:装好散热器,接上电源,串口或 SSH 登录
  2. 查看初始状态:记录空载时的频率、温度、功耗
  3. 启动压力taskset -c 4-7 stress --cpu 4 --timeout 300s
  4. 实时监控:用上面的脚本同时看频率和温度变化
  5. 记录数据:每 10 秒记录一次,持续 5 分钟
  6. 分析结果:看频率是否稳定、温度是否超过 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 功率计,几十块钱,比啥都靠谱。
总结一句话: CPU 压力测试不是跑个 stress 就完事了。你得盯着频率、温度、功耗这三个指标,看它们能不能在满载下保持稳定。任何一个指标异常,都可能是系统稳定性的隐患。

下一章我们会讲内存压力测试,到时候用 memtesterstress-ng 来折腾 DDR。嗯,那个坑更多,到时候细聊。