路由软路由
解决 OpenWrt 下 CoreMark 跑分仅限单线程的强制多核并发测试脚本
一、背景痛点分析
在玩软路由或嵌入式开发时,我们经常使用 coremark 工具来对 CPU 的基准算力进行量化测试。然而很多在 OpenWrt 环境下内置或通过预编译包直接安装的 CoreMark,经常会遇到一个问题:
❌ 常见痛点:
直接在终端执行 coremark 时,无论你的处理器是 4 核、8 核甚至更多线程,它可能只会占用单颗核心进行单线程跑分。不仅多核总分无法正确体现,更没办法反应出高并发状态下的真实系统瓶颈与多线程加速增益。
为了解决强制这个单线程运行的问题,我编写了一个轻量高效的 Shell 脚本。它通过 Linux 底层并发机制强行将原有的二进制文件并行化多路输出,从而反应出所有逻辑核心的全部性能。
二、完整多核强跑脚本代码
创建一个名为 run_coremark.sh 的脚本文件,将以下代码粘贴进去。代码实现了多核心自动探测、并行分发以及最终多核总分的精确汇总:
#!/bin/sh
# 1. 改进的核心识别:统计 cpuinfo 中 processor 的数量
threads=$(grep -c "processor" /proc/cpuinfo)
echo "--------------------------------"
echo "检测到逻辑核心总数: $threads"
echo "正在启动全核并行跑分..."
# 2. 清理残留文件并开始后台运行
rm -f /tmp/coremark_*.log
for i in $(seq 1 $threads); do
coremark > /tmp/coremark_$i.log 2>&1 &
done
# 3. 实时监控提示
echo "coremark运行中,请等待约 15-20 秒..."
wait
# 4. 计算总分
total_score=$(grep "Iterations/Sec" /tmp/coremark_*.log | awk '{sum += $3} END {print sum}')
echo "--------------------------------"
echo "多核总分: $total_score"
echo "平均每个核心得分: $(awk -v a=$total_score -v b=$threads 'BEGIN {print a/b}')"
echo "--------------------------------"
# 5. 清理临时文件
rm -f /tmp/coremark_*.log
三、脚本设计逻辑解析
- 精准探测物理核心: 脚本通过检索 Linux 内置系统文件
/proc/cpuinfo中processor出现的总频次,动态反推系统的最大逻辑线程总数。不管是双核的 ARM 边缘设备还是多核心的 x86,皆可做到完美自适应。 - 优雅的后台异步并发: 巧用
&异步执行符将任务送进后台,利用for循环在极短时间内对所有逻辑核心同时下达高负载指令。 - 通过
wait阻塞确保同步: 抛出后台后使用 Linux 原生命令wait全程监听,直到所有核心跑分流全部平稳结束后,才继续向下推进主线程。这从根本上确保了日志数据收集的完整性和准确度。 - 高阶文本处理自动统计: 所有的各核心数据记录在
/tmp内存级缓存目录中。测试完毕后利用强大灵活的awk文本流计算工具,精准拦截并叠加各核心的Iterations/Sec指标,瞬间合算出高精度的总体多线程算力。
四、使用指南
通过 SSH 客户端连接上你的 OpenWrt 路由器后,执行以下命令:
# 1. 赋予脚本可执行权限
chmod +x ./run_coremark.sh
# 2. 强跑全核并发测试
./run_coremark.sh