前阵子给一批新服务器做上线前的性能基线,几台同款机器装的是浪潮信息KeyarchOS(KOS)。业务同学反馈说某些批处理任务偶尔变慢,我需要先确认问题出在系统配置还是硬件本身,于是第一件事就是把UnixBench拉起来跑了一轮。这套工具我从CentOS时代用到现在,源码基本没什么大变化,测试逻辑稳定,非常适合在KeyarchOS这种Linux发行版上做横向对比和调优前后对照。
这篇文章就是一份纯实操指南,从安装包下载、源码编译、参数配置到结果解读,全部基于我最近在KOS上完整跑通的一轮测试整理。命令和步骤可以直接抄,适合刚接触KeyarchOS、需要给服务器做性能验证,或者想建立一套可复现性能基线的运维、测试和后端同学。
1. 为什么选UnixBench给KeyarchOS做基准测试
1.1 一块跑了三十多年的综合性能试金石
UnixBench可以说是Linux生态里最经典的基准测试套件之一,源自上世纪八十年代的Unix平台,后来被移植到Linux并持续维护。它不是只压CPU主频或者内存带宽,而是模拟了一台机器在典型Unix负载下的整体表现,覆盖整数运算、浮点运算、进程调度、进程创建、文件复制、管道通信、上下文切换、shell脚本执行和系统调用开销等一整套测试模块。
这种设计思路对服务器系统特别有意义。业务同学说“机器有点慢”,原因可能不是CPU频率不够,而是内核调度策略、文件系统缓存方式、默认的进程创建路径出了瓶颈。UnixBench把这一层层拆开跑一遍,分数低的分项大概率就是真实业务的短板所在。对于KeyarchOS这种面向数据中心场景的操作系统来说,它测的不是纸面参数,而是系统在平时干活时顺不顺。
我试过很多次,一些看起来差异很大的发行版,单靠lscpu看硬件参数几乎没法分辨性能差异,但UnixBench跑完就能看出明显的分项差别。这就是它作为“试金石”的价值。
1.2 它适合做什么,不适合做什么
先说适合的:
- 同一台物理机上,对比不同内核版本、不同系统版本的性能变化。
- 调优前后做基线对照,比如改动内核参数、切换调度策略、调整文件系统挂载选项。
- 新机器验收时快速确认硬件是否存在明显短板。
- 设备选型时,在同配置机器上跨系统做初步参考。
不合适的场景也很明确:
- 不能替代真实业务压测,像数据库TPS、Web并发、网络吞吐这些要用对应专业工具。
- 不适合跨架构直接比绝对分数,x86和ARM用同一套UnixBench跑出来的总分没有直接可比性。
- 受编译器和内核配置影响较大,对比时如果软件栈不一致,结果要谨慎解读。
所以我的定位是:UnixBench适合做“系统健康状况体检”,不适合做“业务容量评估”。如果某台KeyarchOS机器的进程创建分项特别低,而你恰好要部署高并发短任务型服务,那这个信号比任何宣传参数都更有说服力。
1.3 在KeyarchOS上的参考意义
KeyarchOS本身对内核和编译工具链做过适配,用户更关心的是默认装好之后的实际表现。我在KOS上跑UnixBench有一个原则:不跟别的操作系统搞“排行榜”,因为不同硬件、不同BIOS配置下跑分没意义;但在同一台机器上,同一个KOS版本,调整参数前后跑出来的差值,是非常可靠的数据。
换句话说,UnixBench在KeyarchOS上的真正价值,是帮你建立一条前后一致的性能参考线。有了这条线,后面不管是升级内核、换驱动、调优配置,还是排查偶发性能问题,你都有一个可以锚定的基准点。
2. 跑分前准备:从系统状态到依赖工具链
2.1 先确认KeyarchOS版本与内核运行参数
跑分之前,我习惯先把机器的“身份信息”记录下来,否则跑完分数都不知道对应哪个系统状态。我的标准命令是:
cat /etc/os-release uname -a cat /proc/cmdline这三条分别确认系统版本、内核版本和启动参数。如果想再细致一点,还可以把NUMA和调度器相关参数打出来:
sysctl -a | grep -E 'sched|numa' | head -20跑分前不要急着执行,先让系统空转五到十分钟,把开机自启动的服务、动态调频的CPU频率都稳定下来。如果机器刚经历过一次大负载,缓存里还留着大量数据,跑出来的成绩会虚高,后面再对比时就有偏差。
2.2 最小依赖安装:gcc、make、time
UnixBench是用C语言写的,编译阶段需要gcc和make,运行阶段还依赖time命令。这里有个很容易踩的坑:有些最小化安装的服务器虽然装了gcc和make,但没装time,结果源码编译成功,./Run跑到一半直接报错,浪费不少时间。
在KeyarchOS上安装依赖很简单:
dnf install -y gcc make time如果系统提示没有dnf命令,就换成:
yum install -y gcc make time如果公司内网环境没配好软件源,dnf会直接报找不到源或者下载失败。这种情况我建议先确认KeyarchOS官方源是否已经配置,或者挂载系统安装介质做本地源,别从网上随便找一个源替换,容易引入依赖版本不一致的问题。离线环境下也可以提前下载好这三个rpm包,用rpm -Uvh一次装好。
2.3 硬件约束与测试场景控制:别让机器“带病跑分”
跑分最忌讳的就是在“带病”状态下测。我总结了几条硬性约束:
- 不要在正在跑业务的生产机上直接测,结果没有参考价值,还可能影响线上服务。
- 服务器如果开了动态调频,建议切换成performance模式,保证每轮测试的CPU频率一致:
cpupower frequency-set -g performance虚拟机上跑分还要注意宿主机的争抢,同配置的虚拟机在不同宿主机时段跑出来的分数会波动。
- 跑分前检查后台任务:
ps aux | grep -E 'yum|dnf|cron|java|mysql' | grep -v grep系统更新、监控Agent、定时任务这些后台进程,会明显拉低进程创建和上下文切换的分项成绩。
- 如果是做对比测试,务必使用同一台物理机或完全相同的机型,同时保持BIOS设置一致。很多人忽略了BIOS里的超线程开关、NUMA模式、电源策略,这些对UnixBench的影响比系统版本差异还大。
3. 安装包从哪下载?源码编译完整步骤
3.1 为什么我不建议下载别人编译好的UnixBench包
网络上搜“unixbench 安装包 下载”,会出来一大堆第三方打包站和论坛附件。我的建议很明确:不要从这里下载。原因有三点。
第一,UnixBench源码非常简单,编译只要不到一分钟,使用预编译包省下的时间几乎可以忽略。第二,第三方包可能基于旧版本,测试脚本和现代系统的适配情况未知,换一个发行版就容易遇到依赖问题。第三,也是最重要的一点,源码包你可以自己校验完整性,但二进制包里装了什么很难看清。
正确的下载渠道是GitHub上的byte-unixbench/byte-unixbench仓库。最省事的方式是直接用git拉取:
git clone https://github.com/byte-unixbench/byte-unixbench.git cd byte-unixbench如果不想装git,也可以去仓库的Releases页面下载tar.gz压缩包。下载后务必做一次校验,GitHub Release页面一般会提供SHA256校验值,用下面的命令核对:
sha256sum byte-unixbench-*.tar.gz把输出的哈希值和页面上的值对比一致后再解压。这一步多花十秒钟,能避免很多莫名其妙的后续问题。
3.2 源码目录结构与编译
克隆或解压之后,目录里的核心部件很清晰:
Run:主运行脚本,跑分入口。Makefile:编译配置。pgms/:测试程序的源码和编译产物。
编译命令非常简单:
cd byte-unixbench make编译过程通常不到一分钟。结束后进入pgms目录,能看到dhry2reg、whetstone-double、execl、pipe、context1、spawn、syscall这些可执行文件,它们分别对应前面说的各个测试模块。
这里要说明一下,make时如果出现和图形测试相关的编译警告或错误,一般不影响跑分,因为Run脚本在服务器环境下默认会跳过图形测试模块。看到这类输出不用紧张,继续下一步就行。
3.3 编译报错的三种常见情况
虽然UnixBench编译简单,但我在不同精简版系统上也遇到过问题:
- 提示
cc: command not found:说明没装gcc,用dnf install -y gcc解决。 - 提示
make: command not found:说明没装make,同样安装即可。 - 编译过程一切正常,但运行
./Run时提示time: command not found:这是最隐蔽的,编译阶段不会报错,运行时才翻车。安装time包:
dnf install -y time还有一个偏门情况:如果机器的用户态是32位,某些测试模块编译会失败。KeyarchOS服务器版基本都是x86_64或aarch64架构,遇到概率很小,但真出现的话先用uname -m确认架构,再考虑换源码版本。
4. 跑分参数完全解读:默认玩法到多核副本
4.1./Run默认到底在跑什么
进入源码目录直接执行:
./Run脚本会按顺序执行下面这些模块:
- Dhrystone 2 using register variables:整数运算能力。
- Double-Precision Whetstone:浮点运算能力。
- Execl Throughput:进程执行吞吐。
- File Copy 系列:不同缓冲区大小和块大小下的文件复制。
- Pipe Throughput:管道吞吐。
- Pipe-based Context Switching:基于管道的上下文切换。
- Process Creation:进程创建速度。
- Shell Scripts:shell脚本执行速率,分1个并发和8个并发两种。
- System Call Overhead:系统调用开销。
默认情况下,整个测试套件会跑较长时间,一般10到30分钟,具体取决于机器性能。脚本内部会对部分模块多次采样,排除第一次热身偏低的影响。
4.2 关键参数-i和-c:迭代与多核副本
./Run直接跑是单进程模式。如果想让结果更稳,或者想测多核服务器的整体表现,需要加参数:
./Run -i 3-i指定迭代次数,也就是整个测试套件重复几轮。我强烈建议至少-i 2,因为第一轮结果往往偏低,缓存预热和动态调频都还没稳定,取后面几轮的数值更接近真实稳态。
./Run -c 4-c指定并行副本数,也就是同时启动几个进程各自跑一套完整测试。假设你的机器是16核,-c 16会做一次满核总负载下的整体压测,能反映出多任务调度能力;如果只想看单核性能基线,用默认的1副本就够了。
两个参数可以组合,比如模拟4路并发、每路测2轮:
./Run -c 4 -i 2这里要理解一点:-c是进程级并发,不是线程级并发。每个副本独立跑完整测试,考验的是系统同时处理多个完整任务的能力,这对理解UnixBench分数很有帮助。
4.3 输出日志保存与结果结构
跑分时间长,建议后台执行并把输出存到文件:
nohup ./Run -c 2 -i 3 > result.txt 2>&1 & tail -f result.txt跑完之后看result.txt末尾,结果长这样:
System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 XXXXX.X XXXX.X ... System Benchmarks Index Score XXXXX.X每行最后的INDEX就是该模块相对于基线机器的指数,最后一行System Benchmarks Index Score是总分。注意不要把中间某个模块的INDEX当成总分,它们的关系后面会详细讲。
5. 结果别只看总分:把分项逐个读透才算会用
5.1 每个测试模块背后的业务含义
很多新手拿到结果只盯着最后的Index Score,其实分项表才是最有价值的部分。我用一个表格说明各模块对应的能力和典型业务场景:
| 测试模块 | 主要衡量内容 | 典型关联业务 |
|---|---|---|
| Dhrystone 2 | 整数逻辑运算、字符串处理 | 一般计算任务、编译器、数据处理 |
| Whetstone | 浮点运算能力 | 科学计算、视频处理、机器学习推理 |
| Execl Throughput | 程序装载与执行速度 | 大量短命令执行、脚本并发 |
| File Copy | 文件系统读写与缓存机制 | 日志写入、数据搬运、备份恢复 |
| Pipe Throughput | 进程间管道通信吞吐 | 轻量数据流传输 |
| Context Switching | 进程/线程切换效率 | 高并发服务、大量小任务调度 |
| Process Creation | 进程派生速度 | Web Worker、容器短期任务、批处理 |
| Shell Scripts | 脚本解释与批量命令执行 | 自动化运维、任务编排 |
| System Call Overhead | 内核态与用户态切换成本 | 高频系统调用类应用 |
我个人的习惯是,把这些模块分成三组看:CPU算力类(Dhrystone、Whetstone)、系统调度类(Execl、Process Creation、Context Switching、Pipeline)、文件与IO类(File Copy、Pipe、Shell Scripts)。哪一组明显偏低,就往哪个方向排查。
5.2 Score分数的生成逻辑:为什么短板会拉低总分
UnixBench的评分逻辑是:每个模块的实测结果除以一个固定的基线值,得到该模块的INDEX,基线机器的INDEX大约是100。最后把多个模块的INDEX做几何平均,得到System Benchmarks Index Score。
几何平均和算术平均最大的区别是:几何平均对短板极其敏感。假设一台机器整数运算跑出2000,但进程创建只有150,算术平均会把这些高分平均得很漂亮,但几何平均会把总分明显拉低。这其实是UnixBench刻意为之,它想告诉你“系统是一个整体,最弱的那环往往才是真实瓶颈”。
所以看到总分不高时,第一反应不是“机器不行”,而是先翻分项,找到那个掉队最严重的模块。比如文件复制只有同配置机器的一半,问题大概率在文件系统挂载参数、磁盘类型或缓存策略上。
5.3 一次分项分析的实际演示
前阵子在KeyarchOS上做内核参数调优,改动之后跑分总分大约提升了5%。如果只看这个数字,结论就是“调优有效”。但翻看分项表,Dhrystone和Whetstone几乎没变化,File Copy和Context Switching却有明显改善。
这就说明改动的参数主要影响了文件缓存路径和调度效率,而不是CPU计算本身。业务如果以计算为主,这次调优的收益就有限;业务如果以并发任务和文件读写为主,这次调优就是值得的。这种结论只有分项表才能给出来,光看总分只会得出一个模糊的“变快了”的印象。
5.4 什么时候别再依赖UnixBench
UnixBench的分项再全面,它也只是一个通用基准。当你已经确认系统和硬件没有明显异常之后,数据库性能、网络吞吐、Web并发这些场景就该切换到专业压测工具了。UnixBench的作用是帮你快速圈定问题的大方向,精确定位和容量规划还是要靠业务负载测试。这是它最应该被摆正的位置。
6. 实测中的踩坑记录与提升可比性的方法
6.1 我在KeyarchOS上踩过的几个坑
这轮测试下来,有几个坑值得单独记录:
坑一,最小化安装没有time命令。这个前面提过,./Run执行到一半报错,排查了很久才意识到不是源码问题,而是系统缺了最不起眼的工具。
坑二,在KVM虚拟机上跑分,File Copy分项比裸机低了接近一半,进程创建也明显偏低,但CPU整数运算几乎不受影响。原因并不神秘:虚拟化层的磁盘I/O路径和中断处理带来了额外开销,宿主机资源争抢也会体现在上下文切换模块上。所以在虚拟机上跑的分只跟虚拟机比,不要拿去和裸机数据对标。
坑三,后台系统更新进程没清干净。有次跑分时正好撞上dnf在后台执行,Shell Scripts结果非常离谱,一开始还以为代码编译出了问题,后来查进程才发现是系统更新锁了资源。
坑四,SELinux状态不一致。对比两台机器时,一台是enforcing,一台是permissive,进程创建项目差异能到4%-8%的量级(具体数值和配置相关),统一成permissive之后再跑就对齐了。跑分前建议把SELinux、防火墙、tuned profile的状态都记录清楚。
坑五,电源模式影响波动。服务器默认balanced模式时,跑分结果会随负载上下浮动。我习惯用cpupower frequency-set -g performance固定频率,跑完再还原。
6.2 提升结果可比性的十条建议
跑分数据最怕的不是低,而是不可比。以下十条是我最近几年总结出来的操作习惯,按优先级排列:
- 同机型、同BIOS设置,这是横向对比的前提。
- 记录内核版本、启动参数和系统版本。
- 固定CPU频率,至少记录频率范围。
- 确保测试期间独享资源,禁止并发任务。
- 多次取中位数,不要只取单次最优值。
- 跑分前检查磁盘剩余空间,避免File Copy写满分区。
- 统一SELinux、防火墙、tuned profile状态。
- 在容器或虚拟机里跑分,必须注明资源限制和宿主机状态。
- 使用同一版本的UnixBench源码,版本不同分数差异可能很大。
- 对比测试尽量集中在同一维护窗口内完成,避免跨周期环境漂移。
6.3 把跑分固化到例行发布检查清单
跑分最大的意义不在单次分数,而在形成可对比的基线序列。我目前在KeyarchOS上的做法是写了一个简单脚本,每次跑分前先记录系统信息、日期和测试命令,跑完把结果归档到固定目录。这样每次调整内核参数、升级系统版本、替换硬件之后,都能快速调出上一次的基线数据做对比。
不需要复杂工具,shell脚本加上一个归档目录就够用了。如果团队有CI平台,也可以做成定时巡检任务,但最核心的一点是:参数要固定,环境要记录,结果要归档。没有这份历史基线,跑再多次分数也只是数字,没法变成决策依据。
最后说点个人体会。跑分这几年,我最不看重的是那个孤零零的总分,最看重的是分项曲线。UnixBench在KeyarchOS上最大的价值,不是证明某台机器“强不强”,而是让你在调整内核参数、更换系统版本、验收新硬件时,有一条前后一致的参考线。如果哪天你发现总分没变,但Pipeline和Context Switching悄悄掉了,那才是真正值得警惕的信号。下次再有人问“你这系统性能怎么样”,把分项表甩过去,比说一句“跑分不错”靠谱得多。