Buildroot:Debugging, profiling and benchmark(2)
6 dhrystone
Dhrystone是一个基准测试程序,它通过模拟一系列简单的算术运算和内存访问操作来测量CPU的整数运算和逻辑运算性能,其测试结果以DMIPS/MHz为单位,表示在Dhrystone标准测试方法下的MIPS值。
参考《dhrystone计算和测试 - ArnoldLu - 博客园》。
7 dieharder
dieharder用于测试随机数生成器质量的程序。它执行一系列统计测试,以确定随机数生成器是否产生高质量的随机数。这些测试包括各种统计和谱分析,旨在揭示随机数序列中的任何非随机性或模式。
dieharder 是一个随机数生成器测试程序,用于评估随机数生成器(RNG)的随机性。
下面是测试结果说明:
1. 程序信息:
- dieharder version 3.31.1 Copyright 2003 Robert G. Brown:显示程序版本和版权信息。
- rng_name:随机数生成器的名称。
- rands/second:每秒生成的随机数数量。
- Seed:随机数生成器的种子值。
2. 测试结果:
- test_name:测试的名称。
- ntup:测试中使用的元组数量。
- tsamples:测试样本数量。
- psamples:进行的测试次数。
- p-value:测试结果的概率值,用于评估随机性。
- Assessment:测试结果的评估,可能是 PASSED(通过)或 WEAK(弱)。
3. 具体测试:
- diehard_birthdays:测试随机数序列中的生日悖论现象。
- diehard_operm5:测试随机数序列的排列随机性。
- diehard_rank_32x32 和 diehard_rank_6x8:测试随机数的秩次分布。
- diehard_bitstream:测试随机位流的随机性。
- diehard_opso 和 diehard_oqso:测试重叠子序列的随机性。
- diehard_dna:测试随机数序列的DNA序列随机性。
- diehard_count_1s_str 和 diehard_count_1s_byt:测试随机数序列中1的比例。
- diehard_parking_lot:测试随机数序列的停车问题。
- diehard_2dsphere 和 diehard_3dsphere:测试二维和三维球体的随机性。
- diehard_squeeze:测试随机数的压缩随机性。
- diehard_sums:测试随机数序列的和的随机性。
- diehard_runs:测试随机数序列的连续序列。
- diehard_craps:测试随机数序列的craps游戏模拟。
- marsaglia_tsang_gcd:测试随机数序列的最大公约数。
- sts_monobit、sts_runs、sts_serial:测试随机数序列的单比特、运行和序列测试。
- rgb_bitdist、rgb_minimum_distance、rgb_permutations、rgb_lagged_sum:测试随机数的位分布、最小距离、排列和滞后和。
- dab_bytedistrib、dab_dct、dab_filltree、dab_filltree2、dab_monobit2:测试随机数的字节分布、离散余弦变换、填充树和单比特分布。
每个测试后面跟着的 PASSED 或 WEAK 表示该测试是否通过。PASSED 表示测试结果符合随机性预期,而 WEAK 表示测试结果表现出一定的非随机性,可能需要进一步分析。
dieharder -a #=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# rng_name |rands/second| Seed | mt19937| 1.31e+07 | 955896505| #=============================================================================# test_name |ntup| tsamples |psamples| p-value |Assessment #=============================================================================# diehard_birthdays| 0| 100| 100|0.42332790| PASSED diehard_operm5| 0| 1000000| 100|0.87160711| PASSED diehard_rank_32x32| 0| 40000| 100|0.99030303| PASSED diehard_rank_6x8| 0| 100000| 100|0.52018571| PASSED diehard_bitstream| 0| 2097152| 100|0.68813649| PASSED diehard_opso| 0| 2097152| 100|0.98049878| PASSED diehard_oqso| 0| 2097152| 100|0.44585840| PASSED diehard_dna| 0| 2097152| 100|0.08874727| PASSED diehard_count_1s_str| 0| 256000| 100|0.99672632| WEAK diehard_count_1s_byt| 0| 256000| 100|0.90390806| PASSED diehard_parking_lot| 0| 12000| 100|0.79252967| PASSED diehard_2dsphere| 2| 8000| 100|0.63298492| PASSED diehard_3dsphere| 3| 4000| 100|0.66506193| PASSED diehard_squeeze| 0| 100000| 100|0.01733991| PASSED diehard_sums| 0| 100| 100|0.00401878| WEAK diehard_runs| 0| 100000| 100|0.39253104| PASSED diehard_runs| 0| 100000| 100|0.07728590| PASSED diehard_craps| 0| 200000| 100|0.69536299| PASSED diehard_craps| 0| 200000| 100|0.67717207| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.89062810| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.04664388| PASSED sts_monobit| 1| 100000| 100|0.04015319| PASSED sts_runs| 2| 100000| 100|0.93875784| PASSED sts_serial| 1| 100000| 100|0.74001144| PASSED ... sts_serial| 16| 100000| 100|0.29246486| PASSED sts_serial| 16| 100000| 100|0.46699209| PASSED rgb_bitdist| 1| 100000| 100|0.20500430| PASSED ... rgb_bitdist| 12| 100000| 100|0.95141699| PASSED rgb_minimum_distance| 2| 10000| 1000|0.64645565| PASSED rgb_minimum_distance| 3| 10000| 1000|0.96015492| PASSED rgb_minimum_distance| 4| 10000| 1000|0.25532229| PASSED rgb_minimum_distance| 5| 10000| 1000|0.97112238| PASSED rgb_permutations| 2| 100000| 100|0.91583897| PASSED rgb_permutations| 3| 100000| 100|0.19146252| PASSED rgb_permutations| 4| 100000| 100|0.34579236| PASSED rgb_permutations| 5| 100000| 100|0.29236281| PASSED rgb_lagged_sum| 0| 1000000| 100|0.44858892| PASSED rgb_lagged_sum| 1| 1000000| 100|0.94388709| PASSED ... rgb_lagged_sum| 31| 1000000| 100|0.51862100| PASSED rgb_lagged_sum| 32| 1000000| 100|0.11644969| PASSED rgb_kstest_test| 0| 10000| 1000|0.04894941| PASSED dab_bytedistrib| 0| 51200000| 1|0.26939700| PASSED dab_dct| 256| 50000| 1|0.08135305| PASSED Preparing to run test 207. ntuple = 0 dab_filltree| 32| 15000000| 1|0.88545329| PASSED dab_filltree| 32| 15000000| 1|0.12176952| PASSED Preparing to run test 208. ntuple = 0 dab_filltree2| 0| 5000000| 1|0.96612997| PASSED dab_filltree2| 1| 5000000| 1|0.63543455| PASSED Preparing to run test 209. ntuple = 0 dab_monobit2| 12| 65000000| 1|0.17499508| PASSED
8 fio
8.1 fio作用
FIO(Flexible I/O Tester)是一个用于Linux的多线程I/O测试工具,它可以用来测试文件系统的性能,包括块设备和网络文件系统。FIO的主要作用包括:
1. 基准测试和压力测试:用于基准测试和压力/硬件验证,支持多种I/O引擎,如sync、mmap、libaio、posixaio等。
2. I/O优先级:适用于较新的Linux内核,可以评估I/O优先级。
3. 多种I/O模式:支持顺序读写、随机读写以及混合读写等多种I/O模式。
4. 详细的性能报告:显示各种I/O性能信息,包括完整的IO延迟和百分位数。
8.2 fio测试
编写FIO workload主要有两种方式:直接传参和使用job文件。
8.2.1 直接传参测试
直接在命令行中指定参数来定义测试的工作负载。例如:
fio -filename=test.data -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=64M -numjobs=4 -runtime=30 -group_reporting -name=mytest
这个命令表示:
- filename=test.data:测试文件名称。
- direct=1:使用direct I/O,绕过OS的buffer。
- iodepth 1:I/O操作的队列深度。
- thread:使用线程进行测试。
- rw=read:顺序读测试。
- ioengine=psync:I/O引擎。
- bs=16k:块大小为16k。
- size=64M:测试文件大小。
- numjobs=4:并发执行的作业数。
- runtime=300:测试运行时间。
- group_reporting:汇总报告。
- name=mytest:作业名称。
8.2.2 使用Job文件测试
Job文件是一种更灵活的方式来定义多个测试工作负载。以下是一个简单的job文件示例:
[global] ioengine=libaio iodepth=4 direct=1 runtime=60 time_based=1 size=64M group_reporting=1 thread=1 numjobs=2 bs=4k name='test' allow_mounted_write=1 nrfiles=1 [seqread] rw=read filename=fio_read_test.txt [seqwrite] rw=write filename=fio_write_test.txt
这个job文件定义了两个测试工作负载:
- seqread:顺序读测试。
- seqwrite:顺序写测试。
每个工作负载可以有自己的参数,如rw(读写模式)、filename(测试文件路径)等。使用job文件运行FIO时,只需指定文件名即可:
fio fio.conf
8.2.3 Jog选项
按照您的要求,以下是FIO job文件中的global和job-specific选项的说明:
Global Options(全局选项)
- ioengine:定义使用的I/O引擎。可选值:libaio(Linux下的异步I/O引擎),psync(进程同步I/O引擎),posixaio(POSIX异步I/O引擎),sync(同步I/O引擎)。
- numjobs:定义并发执行的作业(线程或进程)数量。可选值:任何正整数,表示作业的数量。
- rw:定义I/O操作的类型。可选值:read(顺序读取),write(顺序写入),randread(随机读取),randwrite(随机写入),randrw(随机混合读写)。
- bs:定义块大小。可选值:例如4k、8k、256k等,表示每次I/O操作的大小。
- size:定义测试文件的大小。可选值:例如128m、1G等,表示文件的总大小。
- runtime:定义测试运行时间。可选值:时间值,例如60秒或4h(4小时)。
- time_based:如果设置为1,即使文件大小达到size指定的大小,测试也会继续直到runtime时间结束。可选值:0(基于大小),1(基于时间)。
- group_reporting:如果设置,将汇总报告。可选值:1(开启汇总报告)。
Job-Specific Options(作业特定选项)
- filename:定义测试的文件或设备。可选值:文件路径或设备名,表示I/O操作的目标。
- iodepth:定义异步I/O的队列深度。可选值:任何正整数,表示I/O操作的队列深度。
- direct:定义是否使用直接I/O。可选值:0(使用buffered I/O),1(使用direct I/O)。
- randrepeat:定义随机I/O模式下是否重复之前的模式。可选值:0(不重复),1(重复)。
- norandommap:定义是否使用随机映射。可选值:1(不使用随机映射)。
- end_fsync:定义测试结束时是否执行fsync。可选值:1(执行fsync)。
- write_iops_log:定义写IOPS日志的文件名。可选值:日志文件的路径,用于记录写入IOPS数据。
- stonewall:定义所有job完成后才继续执行后续job。可选值:1(所有job完成后继续)。
这些选项可以根据测试需求进行组合和配置,以实现不同的测试场景和目标。每个job可以通过覆盖全局选项来设置自己的特定参数。
9 gdb、gdbserver
GDB(GNU Debugger)是一个用于调试程序的命令行工具,而gdbserver是一个支持远程调试的服务器端组件,GDB通过gdbserver与远程目标系统上的程序进行交互,实现远程调试功能。简而言之,GDB是调试器客户端,gdbserver是调试器服务器,它们协同工作以允许开发者在本地机器上对远程机器上的程序进行调试。
参考《GDB(The GNU Project Debugger)的基本使用方法 - ArnoldLu - 博客园》。
10 iozone
IOzone是一个文件系统的benchmark工具,可以测试不同操作系统中文件系统的读写性能。它支持多种测试模式,包括顺序读写、随机读写、反向读、跳跃读、fwrite/fread等。IOzone能够生成Excel格式的测试报告,方便用户直观地查看和分析测试结果。
iozone -a -n 16K -g 4M -i 0 -i 1 -i 5 -f test.data -Rb ./iozone.xls
这个命令执行全面测试,设置最小测试文件大小为16KB,最大测试文件为4MB,测试写入、读取和跳跃读模式,并将结果输出到Excel文件中。
Excel结果如下: