由java语言编写的一个磁盘IO负载生成器,
主要用来测试块设备的存储,也可以测试文件,与FIO类似
优点:
1、可以测试整个集群的io(把整个测试io进行叠加,这样测试的时候可以把全部的虚机全部启动)
2、测试报告会根据主机统计io
3、报告还会根据设备显示io的延迟信息(记录每个io操作的用时),可以保证io是否稳定
与FIO的区别
可以测试块接口也可以测试文件接口,文件接口是去模拟写入文件,这个和mdtest类似,但mdtest是测试元数据能力,vdbench会比较综合
vdbench是中科院研究所使用的新测试软件
1.下载源码
https://www.oracle.com/downloads/server-storage/vdbench-downloads.html
2.解压到vdbench文件夹
unzip vdbench50407.zip -d vdbench
vdbench -f {filename} -o {exportpath}
#注:-f后接测试参数文件名,-o后接导出测试结果路径
vdbench 测试工具涉及到的参数非常多
这些参数可以分为 块存储 和 文件系统 两部分
每部分又是按组进行划分的
所有的参数都需要定义到一个参数文件当中,在被读取的时候都是按顺序进行的,所以在定义时需要按指定的顺序进行定义
块存储参数文件的定义顺序: HD, SD, WD, RD
文件系统参数文件的定义顺序: HD, FSD, FWD, RD
HD 主机定义
SD 存储定义
WD 工作负载定义
RD 运行定义
FSD 文件系统存储定义
FWD 文件工作负载定义
常用选项
-t: 运行5秒的块设备测试,用于测试vdbench是否可用。
-tf: 运行5秒的文件系统测试,用于测试vdbench是否可用。
-f perfile: 加上参数文件prefile,进行实际测试。
-v: 开启数据校验
-vr: 写入数据的同时也进行数据校验,通常用于测试时间比较长的情况。
-v是写入完再校验 -vr是边写入边校验
rsh: 运行rsh守护进程,用于windows联机运行测试。
-o xxx: 将输出文件的路径另为其它路径,默认是保存在当前目录的output目录中。
其它选项: -j , -jn , -jr
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node241
hd=hd2,system=node242
hd=hd3,system=node243
hd= 标识主机定义的名称,多主机运行时,可以使用hd1、hd2、hd3…区分
system= 主机IP地址或主机名
vdbench= vdbench执行文件存放路径,当多主机存放路径不同时,可在hd定义时单独指定
user= slave和master通信使用用户
shell= 可选值为rsh、ssh或vdbench,默认值为rsh
多主机联机测试时,mater和slave主机间通信方式
当参数值为rsh时,需要配置master和slave主机rsh互信
考虑到rsh使用明文传输,安全级别不够,通常情况下不建议使用这种通信方式
当参数值为ssh时,需要配置master和slave主机ssh互信,通常Linux主机联机时使用此通信方式
当参数值为vdbench,需要在所有slave主机运行vdbench rsh启用vdbench本身的rsh守护进程,通常Window主机联机时使用此通信方式
fsd=default,depth=2,width=3,files=2,size=128k
fsd=fsd1,anchor=/mnt/client1
fsd=fsd2,anchor=/mnt/client2
fsd=fsd3,anchor=/mnt/client3
fsd= 标识文件系统定义的名称,多文件系统时(fsd1、fsd2、fsd3…),可以指定default(将相同的参数作为所有fsd的默认值)
anchor= 文件写入根目录
depth= 创建目录层级数(即目录深度)
width= 每层文件夹的子文件夹数
files= 测试文件个数(vdbench测试过程中会生成多层级目录结构,实际只有最后一层目录会生成测试文件)
size= 每个测试文件大小
distribution= 可选值为bottom或all,默认为bottom
–当参数值为bottom时,程序只在最后一层目录写入测试文件
–当参数值为all时,程序在每一层目录都写入测试文件
shared= 可选值为yes或no,默认值为no
一般只有在多主机联机测试时指定
vdbench不允许不同的slave之间共享同一个目录结构下的所有文件,因为这样会带来很大的开销,但是它们允许共享同一个目录结构
加入设置了shared=yes,那么不同的slave可以平分一个目录下所有的文件来进行访问,相当于每个slave有各自等分的访问区域,因此不能测试多个客户的对同一个文件的读写 --当多主机联机测试时,写入的根目录anchor为同一个路径时,需要指定参数值为yes
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node1
hd=hd2,system=node2
hd=hd3,system=node3
fsd=fsd1,anchor=/client/,depth=2,width=100,files=100,size=4k,shared=yes
计算公式如下:
最后一层生成文件夹个数=widthdepth = width的depth次方
测试文件个数=(widthdepth)*files
fsd=fsd1,anchor=/dir1,depth=2,width=3,files=2,size=128k
以上述参数为例,生成目录结构及测试文件如下:
最后一层文件夹数=3^2=9 最后一层文件数=9*2=18
fwd=default,operation=read,xfersize=4k,fileio=sequential,fileselect=random,threads=2
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd2,host=hd2
fwd=fwd3,fsd=fsd3,host=hd3
fwd= 标识文件系统工作负载定义的名称,多文件系统工作负载定义时,可以使用fwd1、fwd2、fwd3…区分
fsd= 标识此工作负载使用文件存储定义的名称
host= 标识此工作负载使用主机
operation= 可选值为read或write,文件操作方式
rdpct= 可选值为0~100,读操作占比百分比,一般混合读写时需要指定,当值为60时,则混合读写比为6:4
fileio= 可选值为random或sequential,标识文件 I/O 将执行的方式
fileselect= random或sequential,标识选择文件或目录的方式
xfersizes= 数据传输(读取和写入操作)处理的数据大小(即单次IO大小)
threads= 此工作负载的并发线程数量
rd=rd1,fwd=(fwd1-fwd3),fwdrate=max,format=restart,elapsed=604800,interval=10
rd= 标识文件系统运行定义的名称。
fwd= 标识文件系统工作负载定义的名称。
fwdrate= 每秒执行的文件系统操作数量。设置为max,表示不做任何限制,按照最大强度自适应
format= 可选值为yes、no或restart,标识预处理目录和文件结构的方式
–yes表示删除目录和文件结构再重新创建
–no表示不删除目录和文件结构
–restart表示只创建未生成的目录或文件,并且增大未达到实际大小的文件
如果测试的时候定义的文件数是1000,后面改为了2000,如果使用了format=restart就会创建1001-2000 如果设置format=yes会删除1000个文件后再重新创建2000,使用format=no就不会重新创建1000个,但会创建1001-2000但不会检查前1000个文件的大小
elapsed= 默认值为30,测试运行持续时间(单位为秒)
interval= 结果输出打印时间间隔(单位为秒)
块设备参数文件定义顺序为:HD、SD、WD、RD
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node241
hd=hd2,system=node242
hd=hd3,system=node243
hd= 标识主机定义的名称,多主机运行时,可以使用hd1、hd2、hd3…区分
system= 主机IP地址或主机名
vdbench= vdbench执行文件存放路径,当多主机存放路径不同时,可在hd定义时单独指定
user= slave和master通信使用用户
shell= 可选值为rsh、ssh或vdbench,默认值为rsh
多主机联机测试时,mater和slave主机间通信方式
当参数值为rsh时,需要配置master和slave主机rsh互信
考虑到rsh使用明文传输,安全级别不够,通常情况下不建议使用这种通信方式
当参数值为ssh时,需要配置master和slave主机ssh互信,通常Linux主机联机时使用此通信方式
当参数值为vdbench,需要在所有slave主机运行vdbench rsh启用vdbench本身的rsh守护进程,通常Window主机联机时使用此通信方式
sd=sd1,hd=hd1,lun=/dev/sdb,openflags=o_direct,threads=6
sd=sd3,hd=hd2,lun=/dev/sdb,openflags=o_direct,threads=6
sd= 标识存储定义的名称
hd= 标识主机定义的名称
lun= 写入块设备,如:/dev/sdb, /dev/sdc…
openflags= 通过设置为o_direct,以无缓冲缓存的方式进行读写操作
threads= 对SD的最大并发I/O请求数量
wd=wd1,sd=sd*,seekpct=100,rdpct=100,xfersize=8k,skew=40
wd=wd2,sd=sd*,seekpct=100,rdpct=0,xfersize=8k,skew=10
wd=wd3,sd=sd*,seekpct=100,rdpct=100,xfersize=1024k,skew=40
wd=wd4,sd=sd*,seekpct=100,rdpct=0,xfersize=1024k,skew=10
wd= 标识工作负载定义的名称
sd= 标识存储定义的名称
seekpct= 可选值为0或100(也可使用sequential或random表示),默认值为100,随机寻道的百分比,
设置为0时表示顺序,设置为100时表示随机。
rdpct= 读取请求占请求总数的百分比,
设置为0时表示写,设置为100时表示读
xfersize= 要传输的数据大小。默认设置为4k
skew= 非必选项,一般在多个工作负载时需要指定,表示该工作负载占总工作量百分比(skew总和为100)
rd=rd1,wd=wd*,iorate=max,maxdata=400GB,warmup=30,elapse=604800,interval=5
rd= 标识运行定义的名称
wd= 标识工作负载定义的名称
iorate= 常用可选值为100、max,此工作负载的固定I/O速率
–当参数值为100时,以每秒100个I/Os的速度运行工作负载,当参数值设置为一个低于最大速率的值时,可以达到限制读写速度的效果
–当参数值为max时,以最大的I/O速率运行工作负载
一般测试读写最大性能时,该参数值均为max
warmup= 预热时间(单位为秒)
默认情况下vdbench会将第一个时间间隔输出数据排除在外,程序在预热时间内的测试不纳入最终测试结果中
(即预热结束后,才开始正式测试)
–当interval为5、elapsed为600时,测试性能为2 elapsed/interval(avg_2-120)时间间隔内的平均性能
–当interval为5、warmup为60、elapsed为600时,测试性能为1+(warmup/interval)(warmup+elapsed)/interval(avg_13-132)时间间隔内的平均性能
maxdata= 读写数据大小,通常情况下,当运行elapsed时间后测试结束
当同时指定elapsed和maxdata参数值时,以最快运行完的参数为准(即maxdata测试时间小于elapsed时,程序写完maxdata数据量后结束)
–当参数值为100以下时,表示读写数据量为总存储定义大小的倍数
如maxdata=2,则是2个存储定义(每个存储定义数据量为100G),则实际读写数据大小为400G
–当参数值为100以上时,表示数据量为实际读写数据量(可以使用单位M、G、T等)
elapsed= 默认值为30,测试运行持续时间(单位为秒)
interval= 报告时间间隔(单位为秒)
单节点针对裸盘测试,1M顺序写,测试时间600s,预热时间60s,报告时间间隔2s
编写Single-RawDisk.html文件
执行
./vdbench -f Single-RawDisk.html
测试结果
iorate:io操作速度
MB/sec:每秒写入速度
bytes i/o:io带宽
read pct :读取占比
resp time:响应
read resp:读取响应
write resp:写入响应
read max:读取最大响应
write max:写入最大响应
resp stddev:响应标准差(越小越好)
queue depth:文件夹队列深度
安装部署后,配置多主机ssh互信 2、master主机运行测试参数文件即可 示例如下,三节点针对裸盘联机测试,1M顺序写,测试数据量为400G,预热时间30s,报告间隔5s
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=cat1
hd=hd2,system=cat2
sd=sd1,hd=hd1,lun=/dev/sdc,openflag=o_direct
sd=sd2,hd=hd2,lun=/dev/sdc,openflag=o_direct
wd=wd1,sd=sd*,seekpct=0,rdpct=0,xfersize=1M
rd=rd1,wd=wd1,iorate=max,maxdata=100M,elapsed=64800,warmup=30,interval=5
执行
./vdbench -f Multi-RawDisk
当vdbench运行完负载测试后,会在安装目录下生成output文件夹,里边包含测试结果文件
当运行测试启用数据校验时,它可能会包含一些错误信息,如:
无效的密钥读取
无效的 lba 读取(一个扇区的逻辑字节地址)
无效的 SD 或 FSD 名称读取
数据损坏
坏扇区
生成的一种逐列的 ASCII 格式的信息,可以使用parseflat参数解析结果
./vdbench parseflat -i -o output.csv [-c col1 col2 ..] [-a] [-f
col1 value1 col2 value2..]
-i input flatfile, e.g. output/flatfile.html
-o output CSV file name (default stdout)
-c which column to write to CSV. Columns are written in the order specified
-f filters: 'if (colX == valueX) ... ...' (Alphabetic compare)
-a include only the 'avg' data. Default: include only non-avg data.
-i是表示待分析的文件,这里写vdbench输出目录里的flatfile.html这个文件,写其它文件不能正常解析;
-o是解析后的输出文件,可以手动指定存放目录。文件格式为CSV,此文件的列由-c参数指定,列的顺序为-c参数的顺序
-a是表示csv文件中只记录测试过程中的avg值
示例如下:
.\vdbench.bat parseflat -i D:\vdbench50406\output\flatfile.html -c run rate
MB/sec seekpct rdpct bytes/io threads resp -o d:\output.csv -a
vdbench parseflat arguments:
Argument 0: -i
Argument 1: D:\vdbench50406\output\flatfile.html
Argument 2: -c
Argument 3: run
Argument 4: rate
Argument 5: MB/sec
Argument 6: seekpct
Argument 7: rdpct
Argument 8: bytes/io
Argument 9: threads
Argument 10: resp
Argument 11: -o
Argument 12: D:\output.csv
Argument 13: -a
14:12:49.265 ParseFlat completed successfully.
包含 Java 代码写入控制台窗口的每行信息的副本。logfile.html 主要用于调试用途
记录全部数据信息,显示每个报告间隔内总体性能情况及工作负载情况,以及除第一个间隔外的所有间隔的加权平均值
记录全部数据计算之后的平均值,一般测试结果从该文件取值,除第一个间隔外所有间隔的加权平均值
totals.html 一般包括两个部分,第一部分为文件存储目录结构及数据填充的平均性能值,第二部分为执行测试过程中除第一个时间间隔外所有时间间隔平均性能值,主要看第二部分的内容
Interval 报告间隔序号,测试结果一般为除第一个时间间隔外所有时间间隔加权平均值 如elapsed=600,interval=5,则性能结果为第2个间隔到第120个间隔的平均值(avg_2-120)
ReqstdOps
rate 每秒读写I/O个数(读写IOPS),可以通过rd运行定义参数fwdrate控制 当fwdrate为max时,以最大I/O速率运行工作负载 当fwdrate为低于最大I/0速率的一个数值时,可以限制读写速度,以固定I/O速率运行工作负载
resp 读写请求响应时间(读写时延),单位为ms
cpu%
total 总的cpu占用率
sys 系统cpu占用率
read pct 读取请求占总请求数百分比占比,当为0时表示写,当为100时表示读
read
rate 每秒读I/O个数(读IOPS)
resp 读请求响应时间(读时延),单位为ms
write
rate 每秒写I/O个数(写IOPS)
resp 写请求响应时间(写时延),单位为ms
mb/sec
read 每秒读取速度
write 每秒写入速度
total 每秒读写速度总和
xfersize 每个读写I/O传输数据量(即单个读写I/O大小),单位为字节B
4M顺序写 目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序写
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node21
hd=hd2,system=node22
hd=hd3,system=node23
hd=hd4,system=node24
hd=hd5,system=node25
hd=hd6,system=node26
fsd=fsd1,anchor=/client/test01,depth=2,width=100,files=100,size=4M,shared=yes
fwd=format,threads=24,xfersize=1m
fwd=default,xfersize=1m,fileio=sequential,fileselect=sequential,operation=write,threads=24
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd1,host=hd2
fwd=fwd3,fsd=fsd1,host=hd3
fwd=fwd4,fsd=fsd1,host=hd4
fwd=fwd5,fsd=fsd1,host=hd5
fwd=fwd6,fsd=fsd1,host=hd6
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1
4M顺序读 目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序读
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node21
hd=hd2,system=node22
hd=hd3,system=node23
hd=hd4,system=node24
hd=hd5,system=node25
hd=hd6,system=node26
fsd=fsd1,anchor=/client/test03,depth=2,width=100,files=100,size=8M,shared=yes
fwd=format,threads=24,xfersize=1m
fwd=default,xfersize=1m,fileio=sequence,fileselect=sequence,rdpct=100,threads=24
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd1,host=hd2
fwd=fwd3,fsd=fsd1,host=hd3
fwd=fwd4,fsd=fsd1,host=hd4
fwd=fwd5,fsd=fsd1,host=hd5
fwd=fwd6,fsd=fsd1,host=hd6
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1
8M混合读写 目录深度2、单级目录数100、单个目录文件数100、单文件大小8M、IO块大小1M、混合读写(读写比为6:4)
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node21
hd=hd2,system=node22
hd=hd3,system=node23
hd=hd4,system=node24
hd=hd5,system=node25
hd=hd6,system=node26
fsd=fsd1,anchor=/client/test03,depth=2,width=100,files=100,size=8M,shared=yes
fwd=format,threads=24,xfersize=1m
fwd=default,xfersize=1m,fileio=random,fileselect=random,rdpct=60,threads=24
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd1,host=hd2
fwd=fwd3,fsd=fsd1,host=hd3
fwd=fwd4,fsd=fsd1,host=hd4
fwd=fwd5,fsd=fsd1,host=hd5
fwd=fwd6,fsd=fsd1,host=hd6
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1
线程数(thread)一般设置为客户端CPU线程数总大小 grep ‘processor’ /proc/cpuinfo |
sort -u | wc -l
测试总数据量需要为客户端内存大小两倍
测试读模型时需要清理客户端缓存信息
sync;echo 3 > /proc/sys/vm/drop_cache