3123 字
16 分钟
性能测试
I/O命令
- I/O命令基本属性包括:读写类型(Read/Write),命令块大小(cmdBlockSize)
- I/O命令性能指标:命令延时(cmdRespTime)
读操作为前台操作,写操作为后台操作
I/O模型
三个基本属性:
- 平均块大小(AvgBlockSize):I/O请求序列中所有请求的块大小的平均值,一般单位是B、KB、MB。通常简称为块大小(BlockSize)
- 读写比例(ReadPct/WritePct):读和写请求再I/O请求序列中的比例,可以用IOPS或MBPS来衡量
- 随机度分布(SeqPct/RandPct):顺序和随机请求在I/O请求序列中所占的比例,随机一般指均匀分布
I/O队列

I/O模型性能指标
特定I/O模型以及特定压力大小下I/O处理能力
- 吞吐量(MBPS):每秒传输的数据量
- 每秒请求数(IOPS):每秒处理的I/O请求数
- 平均延时(AvgRespTime):I/O请求处理平均耗时,单位多用ms表示
关联关系:
- 性能影响的因素:CPU,内存,磁盘性能,网络性能,系统多层队列处理机制
vdbench
vdbench是一款用于基准测试存储产品的磁盘io负载生成器。
使用说明
vdbench的使用需要操作系统安装java运行环境,同时采用命令行的方式进行测试。
- 通常,可以使用下方命令进行测试:
./vdbench -f <vdbench_file> -o <output_file>
# -f 指定测试负载参数文件,-o 指定测试结果输出目录,默认为当前目录负载参数文件
vdbench按照一定的顺序来解析文件,对于磁盘测试:General,HD,SD,WD和RD;对于文件系统测试:General,HS,FSD,FWD和RD 例如:
# General(通用定义)dedupratio=30journal=yesreport=host_detail# HD(主机定义)hd=hd1,system=localhost,vdbench=/home/vdbench,user=root,jvms=8# FSD(文件系统存储定义)fsd=fsd1,anchor=Y:\nasPerf,depth=2,width=3,files=1000,size=(64k,40,128k,30,512k,30)# FWD(文件系统工作负载定义)fwd=fwd1,fsd=fsd*,operation=read,xfersize=8k,fileio=random,fileselect=random,threads=32# RD(运行定义)rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=300,interval=1裸盘测试参数
- 1.General 通用定义
# General parameters
compratio=nn # 定义写入磁盘的数据压缩比dedupratio= nn # 重删比,默认为1 (全部数据块都是不同的)dedupunit= nn # 重删数据块的大小,默认128KBdedupsets= # 多少个重删数据,默认5%。比如1024个128K的SD,5%就是51个重删数据,也就是把重删的那一部分数据分成51组,每一组中的数据都是一样的。concatenatesds=yes #联合测试,把所有SD定义的存储当作一个LUN测试。create_anchors=yes #在FSD定义中,生成根目录
ios_per_jvm=nnnnnn # 每一个java虚拟机每秒可运行的最大IO操作,默认为100,000loop=nn # 重复运行测试多少次repeat nn timesloop=nn[s|m|h] # 在多少时间后,重复测试pattern= # 重新定义生成的数据模型port=nn # 重新指定Java端口showlba=yes # 收集数据,用于showlba分析messagescan=no # 不浏览、打印系统日志- 2.HD 主机定义
# HD(主机定义)hd=default,vdbench=/home/vdbench,shell=ssh,user=root # 该行定义的参数为下面所有主机的全局参数,如果某个主机有单独的参数则会覆盖该行参数hd=hd1,system=localhost,vdbench=/root/vdbenchhd=hd2,system=172.0.73.23hd=hd3,system=172.0.73.24
# 常用参数说明# hd=default 设置全局参数# hd=localhost 设置当前主机参数# hd=hd1 添加主机参数# system=xxx 指定主机ip# vdbench=xxx 添加主机的vdbench路径# jvms=nn 指定java虚拟机数量# shell=xxx 指定通信协议,以控制远程主机开启vdbench# user=xxx 指定远程主机登录用户名- 3.SD 存储定义,设置需要测试的磁盘、lvm卷和文件相关参数
# SDsd=sd1,host=hd1,lun=/dev/mapper/mpathb,openflags=o_direct,thread=8# 定义了一个名为sd1的测试目标。它使用8个并发线程,通过Direct I/O的方式,对连接在 hd1 主机上、由多路径软件管理的名为 /dev/mapper/mpathb的LUN,进行性能压测。sd=sd2,host=hd2,lun=/dev/mapper/mpathc,openflags=o_direct,thread=8
# 常用参数说明# sd=default # 设置全局参数# sd=name # 设置该sd的别名# dedupratio= # 参考General中的定义,除了dedupunit必须在General中定义外,其余的重删参数都可以给特定的SD定义。# dedupsets=# deduphotsets=# dedupflipflop=# hitarea=nn # 读命中大小,默认1m。配合rhpct、whpct使用# host=name # 指定该SD在哪台主机,如果不设置 默认在当前主机# journal=xxx # 指定检验日志目录# lun=lun_name # 指定磁盘或文件# openflags=(flag,..) # 通过特定的方式打开LUN或文件,绕过缓存常用的参数;常见参数:linux:o_direct or directio,o_dsync,o_rsync,o_sync,fsync;windows:directio,o_dsync,o_rsync,o_sync# range=(nn,mm) # 指定测试的范围,默认是全盘# size=nn # 用于工作负载的文件/磁盘大小(非必需)# threads=nn # 该SD的最大并发数(outstanding I/O),默认为8- 4.WD 工作负载定义
wd=wd1,sd=(sd1,sd2),rdpct=100,xfersize=4k
# 常用参数说明# wd=default # 设置工作负载全局参数# wd=name # 设置该工作负载的别名# sd=xx # 指定该工作负载用于那个存储定义(sd)# host=host_label # 指定哪个主机运行该工作负载,默认为本地主机# iorate=nn # 设置该工作负载的固定IOPS# openflags=(flag,..) # 通过特定的方式打开lun或文件# priority=nn # 该工作负载的优先级,=1 最高,往后递降# range=(nn,nn) # 限定该工作负载在SD上的作用范围# rdpct=nn # 读占比,默认100# rhpct=nn # 读命中占比,默认0# seekpct=nn # 随机IO占比,默认seekpct=100或seekpct=random# skew=nn # 该工作负载占总IO的比例,也就是可以规定不同的工作负载比例# streams=(nn,mm) # 在同一个设备(lun/文件)上建立多个顺序IO流# stride=(min,max) # To allow for skip-sequential I/O.# threads=nn # IO并发数,只有在联合SD的情况下能使用(见SD concatenation)# whpct=nn # 写命中占比,默认为0# xfersize=nn # IO块大小,默认4K# xfersize=(n,m,n,m,..) # 指定IO块大小的分布# xfersize=(min,max,align) # 在(min,max)的范围内随机生成IO块大小- 5.RD 运行定义
rd=run1,wd=(wd1,wd2),iorate=1000,elapsed=60,interval=5# 定义了一个名为run1的测试任务:同时启动wd1和wd2两种工作负载,整体的I/O速率限制在1000IOPS。持续运行60秒,且每隔5秒就会在屏幕上打印一次性能统计信息。
# 常用参数说明# rd=default # 设置rd全局参数# rd=name # rd别名# wd=xx # 该RD作用于哪个工作负载# sd=xxx # 该RD作用于哪些SDs(可选)# interval=nn # 打印间隔# elapsed=nn # 运行时间,默认30秒# maxdata=nn. # 本次测试的最大文件大小。当elapsed或者maxdata达到设定值,IO都会停止# openflags=xxxx # 通过特定的方式打开文件或LUN# warmup=nn # 预热时间文件系统测试参数
- 1.FSD 文件系统定义
fsd=fsd1,anchor=/dir1,depth=2,width=2,files=2,size=128k
# 常用参数说明# fsd=name # 设置FSD别名# fsd=default # FSD全局参数# anchor=/dir/ # 测试目录# depth=nn # 目录深度# distribution=all # 每个目录都生成文件,默认只在最底层目录生成文件# width=nn # 设置每层级多少个目录# files=nn # 每个最底层目录生成多少个文件# openflags=(flag,..) # 通过特定方式处理IO请求# shared=yes/no # 是否共享FSD给不同的Slaves或主机。文件数量很大的时候,为了减少slaves间关于文件状态信息的交流,可以使用 shared ,让每个slaves使用属于自己的那一部分文件。# sizes=(nn,nn,…..) # 文件大小# totalsize=nnn # 总文件大小# journal=dir # 数据检验日志目录- 2.FWD 文件系统工作负载定义
fwd=fwd1,fsd=fsd1,operation=read,xfersize=4k,fileio=sequential,fileselect=random,threads=2
# 常用参数说明# fwd=name # FWD别名# fwd=default # FWD全局参数# fsd=(xx,….) # 该工作负载作用于哪些FSD(文件系统定义)# fileio=(random.shared) # 允许多个线程共用一个文件# fileio=(seq,delete) # 顺序IO,当第一次写入时,先删除文件# fileio=random # 随机文件IO# fileio=sequential # 顺序文件IO# fileselect=random/seq # 如何选择一个目录或文件# host=host_label # 该工作负载作用于哪个主机# operation=xxxx # 规定对文件的操作# # mkdir, rmdir, create, delete, open, close, read, write, access, getattr and setattr# rdpct=nn # 混合读写中的读占比(只能用于 operation=read 和 operation=write)# skew=nn # 该工作负载占比# threads=nn # 线程数 (文件数需要大于线程数)# xfersize=(nn,…) # 读写文件时的IO块大小- 3.RD (文件系统独有的参数)
rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=10,interval=1
# 常用参数说明# fwd=(xx,yy,..) # 该运行定义作用于哪个工作负载# fwdrate=nn # 每秒的操作数# format=yes/no/only/restart/clean/once/directories # 是否重新创建(格式化)XXX# operations=xx # 覆盖FWD中的文件操作测试示例
测试参数:
云主机3块盘,每块盘8线程,读占比70%,io速率尽可能最大,测试2小时,每5s打印结果
# 3lun_4khd=default,vdbench=/root/vdbench50406,user=root,shell=sshhd=host1,system=localhost
sd=sd1,lun=/dev/vdb,openflags=directio,threads=8sd=sd2,lun=/dev/vdc,openflags=directio,threads=8sd=sd3,lun=/dev/vdd,openflags=directio,threads=8
wd=wd1,sd=sd*,rdpct=70,xfersize=4krd=run1,wd=wd1,iorate=max,elapsed=2h,interval=5测试命令:
nohup ./vdbench -f 3lun_4k -vr &观察测试结果:
tail -f nohup.out查看测试报告:summary.html
Unixbench(服务器跑分软件)
-
UnixBench是一个类 Unix系统(Unix、BSD、Linux)下的开源性能测试工具,被广泛用于测试Linux系统主机的性能。
-
UnixBench的主要测试项有:系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C库等系统基准性能提供测试数据。
-
工具下载地址:https://download.csdn.net/download/qq_37330657/90014475?spm=1001.2014.3001.5503
运行测试
-
测试系统可能缺失
perl、gcc等依赖,需手动通过包管理器安装依赖 -
测试指令:
Terminal window ./Run -c 1 -c 128-c为并发数,该指令会运行单核和128核(全核)两轮测试
-
测试输出解析:
1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 101 x:单核测试Dhrystone 2 using register variables:测试项目名称1 2 3...:样本测试进度,测试结果为运行多次样本取平均值
测试指标解析
1.CPU 计算性能
- Dhrystone 2 using register variables: 衡量整数运算性能,适用于 CPU 计算能力对比。
- Double-Precision Whetstone: 测试浮点运算能力,适用于科学计算。
- Execl Throughput: 衡量系统执行
execl()的能力,反映进程创建与管理性能。
2.文件 I/O 性能
- File Copy (1024 bufsize, 2000 maxblocks): 测试文件复制性能,涉及 I/O 读写速度。
- File Copy (256 bufsize, 500 maxblocks): 小块文件复制性能。
- File Copy (4096 bufsize, 8000 maxblocks): 大块文件复制性能。
3.进程与线程管理
- Pipe Throughput: 评估进程间通信(IPC)管道的吞吐能力。
- Pipe-based Context Switching: 测试进程上下文切换的效率。
- Process Creation: 评估进程创建的开销。
- Shell Scripts (1 concurrent): 单个 shell 脚本执行能力。
- Shell Scripts (8 concurrent): 8 个 shell 并行执行能力。
- System Call Overhead: 评估系统调用的开销。
输出结果示例
Benchmark Run: 三 10月 22 2025 10:21:35 - 10:53:01 # 测试时间128 CPUs in system; running 128 parallel copies of tests # 128核测试
Dhrystone 2 using register variables 1307112026.1 lps (10.0 s, 7 samples) # 项目的具体数据 整数运算13.07亿次/秒Double-Precision Whetstone 434592.7 MWIPS (10.0 s, 7 samples)Execl Throughput 6792.8 lps (29.7 s, 2 samples)File Copy 1024 bufsize 2000 maxblocks 104257.4 KBps (30.0 s, 2 samples)File Copy 256 bufsize 500 maxblocks 26708.5 KBps (30.0 s, 2 samples)File Copy 4096 bufsize 8000 maxblocks 376215.1 KBps (30.0 s, 2 samples)Pipe Throughput 14919076.5 lps (10.0 s, 7 samples)Pipe-based Context Switching 4045172.9 lps (10.0 s, 7 samples)Process Creation 25810.9 lps (30.0 s, 2 samples)Shell Scripts (1 concurrent) 50317.4 lpm (60.1 s, 2 samples)Shell Scripts (8 concurrent) 7971.9 lpm (60.3 s, 2 samples)System Call Overhead 3563258.8 lps (10.0 s, 7 samples)
System Benchmarks Index Values BASELINE RESULT INDEXDhrystone 2 using register variables 116700.0 1307112026.1 112006.2Double-Precision Whetstone 55.0 434592.7 79016.8Execl Throughput 43.0 6792.8 1579.7File Copy 1024 bufsize 2000 maxblocks 3960.0 104257.4 263.3File Copy 256 bufsize 500 maxblocks 1655.0 26708.5 161.4File Copy 4096 bufsize 8000 maxblocks 5800.0 376215.1 648.6Pipe Throughput 12440.0 14919076.5 11992.8Pipe-based Context Switching 4000.0 4045172.9 10112.9Process Creation 126.0 25810.9 2048.5Shell Scripts (1 concurrent) 42.4 50317.4 11867.3Shell Scripts (8 concurrent) 6.0 7971.9 13286.5System Call Overhead 15000.0 3563258.8 2375.5 ========System Benchmarks Index Score 4261.3BASELINE: 固定的参考值,通常来自于1990年代在一台特定标准机器上运行测试得到的分数RESULT: 测试结果INDEX:单项得分 RESULT ÷ BASELINEIndex Score:综合得分 ⁿ√(INDEX₁ × INDEX₂ × INDEX₃ × … × INDEXₙ)
常见问题
测试结果缺失全核数据
常见的原因是处理器线程数大于默认的16,这种情况下,解决方案是修改Run文件内的maxCopies数值,确保该数值大于或等于处理器线程数
# Configure the categories to which tests can belong.my $testCats = { 'system' => { 'name' => "System Benchmarks", 'maxCopies' => 16 }, '2d' => { 'name' => "2D Graphics Benchmarks", 'maxCopies' => 1 }, '3d' => { 'name' => "3D Graphics Benchmarks", 'maxCopies' => 1 }, 'misc' => { 'name' => "Non-Index Benchmarks", 'maxCopies' => 16 },};修改为
# Configure the categories to which tests can belong.my $testCats = { 'system' => { 'name' => "System Benchmarks", 'maxCopies' => 128 }, '2d' => { 'name' => "2D Graphics Benchmarks", 'maxCopies' => 128 }, '3d' => { 'name' => "3D Graphics Benchmarks", 'maxCopies' => 128 }, 'misc' => { 'name' => "Non-Index Benchmarks", 'maxCopies' => 128 },};