一.简介
unixbench是一个用于测试unix系统性能的工具,也是一个比较通用的benchmark, 此测试的目的是对类Unix 系统提供一个基本的性能指示,很多测试用于系统性能的不同方面,这些测试的结果是一个指数值(index value,如520),这个值是测试系统的测试结果与一个基线系统测试结果比较得到的指数值,这样比原始值更容易得到参考价值,测试集合里面所有的测试得到的指数值结合起来得到整个系统的指数值。
UnixBench也包含一些非常简单的2D和3D图形测试。
UnixBench也支持多CPU系统的测试,默认的行为是测试两次,第一次是一个进程的测试,第二次是 N 份测试,N 等于CPU 个数。这样的设计是为了以下目标:
- 测试系统的单任务性能
- 测试系统的多任务性能
- 测试系统并行处理的能力
UnixBench一个基于系统的基准测试工具,不单纯是CPU 内存 或者磁盘测试工具。测试结果不仅仅取决于硬件,也取决于系统、开发库、甚至是编译器。
二.各项测试点说明
Dhrystone测试
测试聚焦在字符串处理,没有浮点运算操作。这个测试用于测试链接器编译、代码优化、内存缓存、等待状态、整数数据类型等,硬件和软件设计都会非常大的影响测试结果。
Whetstone 测试
这项测试项目用于测试浮点运算效率和速度。这项测试项目包含若干个科学计算的典型性能模块,包含大量的C语言函数,sin cos sqrt exp和日志以及使用整数和浮点的数学操作。包含数组访问、条件分支和过程调用。
Execl Throughput(execl 吞吐,这里的execl是类unix系统非常重要的函数,非办公软件的execl)测试
这项测试测试每秒execl函数调用次数。execl是 exec函数家族的一部分,使用新的图形处理代替当前的图形处理。有许多命令和前端的execve()函数命令非常相似。
File Copy测试
这项测试衡量文件数据从一个文件被传输到另外一个,使用大量的缓存。包括文件的读、写、复制测试,测试指标是一定时间内(默认是10秒)被重写、读、复制的字符数量。
Pipe Throughput(管道吞吐)测试
pipe是简单的进程之间的通讯。管道吞吐测试是测试在一秒钟一个进程写512比特到一个管道中并且读回来的次数。管道吞吐测试和实际编程有差距。
Pipe-based Context Switching (基于管道的上下文交互)测试
这项测试衡量两个进程通过管道交换和整数倍的增加吞吐的次数。基于管道的上下文切换和真实程序很类似。测试程序产生一个双向管道通讯的子线程。
Process Creation(进程创建)测试
这项测试衡量一个进程能产生子线程并且立即退出的次数。新进程真的创建进程阻塞和内存占用,所以测试程序直接使用内存带宽。这项测试用于典型的比较大量的操作系统进程创建操作。
Shell Scripts测试
shell脚本测试用于衡量在一分钟内,一个进程可以启动并停止shell脚本的次数,通常会测试1,2, 3, 4, 8 个shell脚本的共同拷贝,shell脚本是一套转化数据文件的脚本。
System Call Overhead (系统调用消耗)测试
这项测试衡量进入和离开系统内核的消耗,例如,系统调用的消耗。程序简单重复的执行getpid调用(返回调用的进程id)。消耗的指标是调用进入和离开内核的执行时间。
Graphical Tests(图形)测试
由"ubgears"程序组成,测试非常粗的2D和3D图形性能,尤其是3D测试非常有限。测试结果和硬件,系统合适的驱动关系很大。
各项参考图示如下:
三.分数调优的思路
1)设置UB_TMPDIR变量
"fstime", "fsbuffer", "fsdisk"这三项测试主要测试系统采用不同的缓存大小将文件数据从一个文件被传输到另外一个文件的性能,在Run文件下发现这三项测试项的参数均使用了fstime这个测试命令:
而在fstime.c的源码中可以知道,三项测试主要是在磁盘文件中进行读写操作,测试时指定了测试类型为c,测试时间为30s,测试目录为Run脚本中TMPDIR所指定的目录,并且还指定了缓存大小和块的数量,在测试执行之前先会在-d所指定的目录下创建dummy0和dummy1两个文件,文件位置由Run脚本中的TMPDIR决定,而TMPDIR又可根据系统中UB_TMPDIR环境设置:
因此,可在系统环境变量中设置UB_TMPDIR为/dev/shm 。原因在于/dev/shm这个目录是linux下一个利用内存虚拟出来的一个目录,这个目录中的文件都是保存在内存中,而不是磁盘上。其大小是非固定的,即不是预先分配好的内存来存储的。
2)临时文件系统
将测试工具放置在tmpfs临时文件系统下运行,利用 tmpfs 临时文件系统的特性 ,tmpfs用于储存一些需要高速读写的文件而开辟的临时空间,会完全驻留在内存RAM中,读写几乎可以是瞬间的,避免了硬盘性能对测试成绩的影响,但又更加考验 CPU 访问内存的性能。所以执行以下指令:
- 执行指令:mkdir test(文件名不指定,路径不指定,最好在/home下)
- 执行指令:mount tmpfs test(新建的文件名)--t tmpfs
- 将测试工具复制至test文件夹下
- 运行测试工具
3)提高基线
提升基线,让测试工具可以使用64线进行测试,方法是修改Run脚本中的以下字段:'system' => { 'name' => "System Benchmarks", 'maxCopies' => 64 }
4)优化编译等级
修改MAKEFILE中默认的编译优化等级,测试工具默认优化等级为:O2,改成 O3可以在O2的基础上进行更多的优化。
5)程序优化
在MAKEFILE中添加编译关键字:-static --flto,其中static强制工具编译时使用静态连接的方式,使得这一些没有被调用到的方法或变量将会被丢弃掉,不会连接到目标程序中 ,大大减小生成二进制文件的体积。Flto目的在于编译链接期间进行程序优化,多个中间文件通过链接器合并在一起,并将它们组合为一个程序,缩减代码体积,是对整个程序的分析和跨模块的优化。
6)切换到字符界面
使用快捷键"alt+ctrl+F1~F10"将系统切换为字符界面,在字符界面上运行测试工具,因为系统少了图形界面的进程,测试时会有速度上的优化。
四.测试2d3d的方法
如果你需要运行图形测试,请确保"MAKEFILE"文件中第47行"GRAPHIC_TESTS = defined"已经取消注释:
同时将Makefile中的第50行后面追加"-lm"后缀,变成"GL_LIBS = -lGL -lXext -lX11 -lm":
紧接着将Run中的第141行中的"ubgears"加上注释,变成#"ubgears":
下一步,运行"make",重新编译一下代码,等编译完成后,可根据以下选择不同的运行指令:
|---------|----------------|
| 功能 | 指令 |
| 只进行系统测试 | ./Run |
| 只进行图形测试 | ./Run graphics |
| 以上两个都进行 | ./Run gindex |