主流测试软件介绍
目前业内主流存储I/O测试软件有以下几款:
- FIO:是一个开源压力测试工具,由Linux内核存储团队研发,主要用来测试硬盘io性能。这个工具的可定制性非常强,可以根据测试者的想法进行各种混合io测试,它支持13种不同类型io引擎(libaio、sync、mmap、posixaio、network等等)。它可以测试块设备或文件,可以通过多线程或进程模拟各种io操作,可以测试统计iops、带宽和时延等性能。我们主要使用fio工具进行存储性能测试。源码:Github FIO
- vdbench:是一个 I/O 工作负载生成器,由Oracle研发,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试和基准测试。主要使用vdbench测试磁盘和文件系统的读写性能。
- IOmeter:由Intel开发的一款免费软件,主要用于Windows和Linux平台上对磁盘子系统和网络IO做性能测试。Windows用的相对较多,Linux主要使用FIO和vdbench。
注意:
- 存储性能测试时,埋数据使用vdbench比FIO效果好,推荐使用vdbench预埋数据。
- fio测试会对系统的硬盘进行读写,会存在破坏客户数据的风险,因此在生产环境上要谨慎使用,不建议对生产环境的硬盘进行裸盘读写测试。
主要测试指标
主要观测指标为 IOPS
、BW(带宽)
、Latency(时延)
,其中:
- 4K小块场景主要参考指标为IOPS,小块容易测出IOPS瓶颈。
- 1M大块场景主要参考指标为BW,大块容易测出带宽瓶颈。
主要测试场景
主要测试在顺序和随机读写方式下,4K和1M块大小读写性能。各场景变参如下:
- 读写方式:顺序读写、随机读写
- 读写比例:纯读、纯写、7:3混合读写(70%读,30%写)
- 块大小:4K、1M
FIO
安装流程
1 | yum install -y fio |
参数说明
可以使用 fio -help
查看每个参数,具体的参数左右可以在官网查看how to文档,如下为几个常见的参数描述
1 | filename=/dev/emcpowerb 支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb |
测试命令
1 | # 块设备 |
测试结果
1 | [root@mysql-5 ~]# fio -filename=/var/lib/mysql/storage_test -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=libaio -bs=4k -size=20G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k_file |
测试结果参数解析:
io:执行了多少M的IO
bw:平均IO带宽
iops:IOPS
slat:提交延迟
clat:完成延迟
lat:响应时间
bw:带宽
cpu:利用率
IO depths:io队列
IO submit:单个IO提交要提交的IO数
IO complete:Like the above submit number, but for completions instead.
IO issued:The number of read/write requests issued, and how many of them were short.
IO latency:IO完延迟的分布
vdbench
注意:
- 联机测试时,主节点要与其余节点做免密登录认证
- 在联机测试时,客户端的系统时间需保持一致,否则会出现时钟同步告警(this can lead to heartbeat issues)
- 客户端的防火墙要关闭(或者设置开放程序指定端口
5570
、5560
访问)- 关闭系统日志服务
rsyslog
,避免运行时出现其他日志文件打印信息
参数文件添加messagescan=no
可以过滤掉多余的系统日志
安装流程
1 | 安装Java |
常用参数
- 预埋数据
1 | 预埋数据量通常为卷容量的1.2倍 |
- 4M顺序写
目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序写
1 | hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh |
- 4M顺序读
目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序读
1 | hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh |
- 8M混合读写
目录深度2、单级目录数100、单个目录文件数100、单文件大小8M、IO块大小1M、混合读写(读写比为6:4)
1 | hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh |
参数说明
vdbench可用于文件系统及块设备基准性能测试,以下主要介绍文件系统及块存储的常用测试参数
vdbench所有测试参数都定义到一个参数文件内,在运行时按照顺序被读取执行相应操作,在参数文件定义时需要执行顺序进行定义
文件系统
文件系统参数文件定义顺序为:HD、FSD、FWD、RD
- HD(Host Define)
非必选项,单机运行时不需要配置HD参数,一般只有在多主机联机测试时才需要配置
1 | hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh |
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(File System Define)
1 | fsd=default,depth=2,width=3,files=2,size=128k |
- 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
1 | hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh |
计算公式如下:
最后一层生成文件夹个数=width
^depth
测试文件个数=(width
^depth
)*files
1 | fsd=fsd1,anchor=/dir1,depth=2,width=3,files=2,size=128k |
- FWD(FileSystem Workload Defile)
1 | fwd=default,operation=read,xfersize=4k,fileio=sequential,fileselect=random,threads=2 |
fwd= 标识文件系统工作负载定义的名称,多文件系统工作负载定义时,可以使用fwd1、fwd2、fwd3…区分
fsd= 标识此工作负载使用文件存储定义的名称
host= 标识此工作负载使用主机
operation= 可选值为
read
或write
,文件操作方式rdpct= 可选值为
0
~100
,读操作占比百分比,一般混合读写时需要指定,当值为60时,则混合读写比为6:4fileio=
可选值为random
或sequential
,标识文件 I/O 将执行的方式fileselect=
random
或sequential
,标识选择文件或目录的方式xfersizes= 数据传输(读取和写入操作)处理的数据大小(即单次IO大小)
threads= 此工作负载的并发线程数量
- RD(Run Define)
1 | rd=rd1,fwd=(fwd1-fwd3),fwdrate=max,format=restart,elapsed=604800,interval=10 |
- rd= 标识文件系统运行定义的名称。
- fwd= 标识文件系统工作负载定义的名称。
- fwdrate= 每秒执行的文件系统操作数量。设置为max,表示不做任何限制,按照最大强度自适应
- format= 可选值为
yes
、no
或restart
,标识预处理目录和文件结构的方式
–yes表示删除目录和文件结构再重新创建
–no表示不删除目录和文件结构
–restart表示只创建未生成的目录或文件,并且增大未达到实际大小的文件 - elapsed= 默认值为
30
,测试运行持续时间(单位为秒) - interval= 结果输出打印时间间隔(单位为秒)
块设备
块设备参数文件定义顺序为:HD、SD、WD、RD
- HD(Host Define)
非必选项,单机运行时不需要配置HD参数,一般只有在多主机联机测试时才需要配置
1 | hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh |
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(Storage Define)
1 | sd=sd1,hd=hd1,lun=/dev/sdb,openflags=o_direct,threads=6 |
sd= 标识存储定义的名称
hd= 标识主机定义的名称
lun= 写入块设备,如:/dev/sdb, /dev/sdc…
openflags= 通过设置为
o_direct
,以无缓冲缓存的方式进行读写操作threads= 对SD的最大并发I/O请求数量
- WD(Workload Define)
1 | wd=wd1,sd=sd*,seekpct=100,rdpct=100,xfersize=8k,skew=40 |
wd= 标识工作负载定义的名称
sd= 标识存储定义的名称
seekpct= 可选值为
0
或100
(也可使用sequential
或random
表示),默认值为100
,随机寻道的百分比,设置为0
时表示顺序,设置为100
时表示随机。rdpct= 读取请求占请求总数的百分比,设置为0时表示写,设置为100时表示读
xfersize= 要传输的数据大小。默认设置为4k
skew= 非必选项,一般在多个工作负载时需要指定,表示该工作负载占总工作量百分比(skew总和为100)
- RD(Run Define)
1 | 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
时,程序写完elapsed
数据量后结束)
–当参数值为100
以下时,表示读写数据量为总存储定义大小的倍数(如maxdata=2,2个存储定义(每个存储定义数据量为100G),则实际读写数据大小为400G)
–当参数值为100
以上时,表示数据量为实际读写数据量(可以使用单位M、G、T等) - elapsed= 默认值为
30
,测试运行持续时间(单位为秒) - interval= 报告时间间隔(单位为秒)
运行使用
单机运行
- Linux
示例如下,单节点针对裸盘测试,1M顺序写,测试时间600s,预热时间60s,报告时间间隔2s
1 | [root@node241 vdbench50406]# cat Single-RawDisk.html |
- Window
示例如下,单节点针对文件系统测试,1M顺序写,目录深度为2,每层目录数为3,每个目录文件数为10,每个文件大小为200M,测试时间为600s,报告时间时间2s
1 | E:\vdbench50406>more "Single FileSystem.txt" |
联机运行
- Linux
- 配置多主机ssh互信
- master主机运行测试参数文件即可
示例如下,三节点针对裸盘联机测试,1M顺序写,测试数据量为400G,预热时间30s,报告间隔5s
1 | [root@node241 vdbench50406]# cat Multi-RawDisk |
Window
所有slave主机运行vdbench本身rsh守护进程
1
E:\vdbench50406>vdbench rsh
master主机运行测试参数文件即可
示例如下,三节点针对文件系统联机测试,1M顺序写,目录深度为2,每层目录数为3,每个目录文件数为10000,每个文件大小为200M,测试时间为600s,报告间隔1s
1
2
3
4
5
6
7
8
9
10
11
12E:\vdbench50406>more "Multi FileSystem.txt"
hd=default,vdbench=E:\vdbench50406,user=Micah,shell=vdbench
hd=hd1,system=66.66.66.250
hd=hd2,system=66.66.66.252
fsd=fsd1,anchor=Z:\Sigle-FileSystem-01,depth=2,width=3,files=10000,size=200M
fsd=fsd2,anchor=Z:\Sigle-FileSystem-02,depth=2,width=3,files=10000,size=200M
fwd=default,operation=write,xfersize=1M,fileio=sequential,fileselect=random,threads=16
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd2,host=hd2
rd=rd1,fwd=fwd*,fwdrate=max,format=yes,elapsed=600,interval=1
E:\vdbench50406>
E:\vdbench50406>vdbench -f "Multi FileSystem.txt"
结果分析
当vdbench运行完负载测试后,会在安装目录下生成
output
文件夹,里边包含测试结果文件
输出文件
errorlog.html
当运行测试启用数据校验时,它可能会包含一些错误信息,如:
- 无效的密钥读取
- 无效的 lba 读取(一个扇区的逻辑字节地址)
- 无效的 SD 或 FSD 名称读取
- 数据损坏
- 坏扇区
flatfile.html
vdbench 生成的一种逐列的 ASCII 格式的信息,可以使用parseflat
参数解析结果
1 | ./vdbench parseflat -i <flatfile.html> -o output.csv [-c col1 col2 ..] [-a] [-f col1 value1 col2 value2..] |
- histogram.html
一种包含报告柱状图的响应时间、文本格式的文件 - logfile.html
包含 Java 代码写入控制台窗口的每行信息的副本。logfile.html 主要用于调试用途 - parmfile.html
包含测试运行配置参数信息 - summary.html
记录全部数据信息,显示每个报告间隔内总体性能情况及工作负载情况,以及除第一个间隔外的所有间隔的加权平均值 - totals.html
记录全部数据计算之后的平均值,一般测试结果从该文件取值,除第一个间隔外所有间隔的加权平均值
结果分析
文件系统
1 | 测试参数如下: |
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
- rate
- cpu%
- tatol
总的cpu占用率 - sys
系统cpu占用率
- tatol
- read pct
读取请求占总请求数百分比占比,当为0时表示写,当为100时表示读 - read
- rate
每秒读I/O个数(读IOPS) - resp
读请求响应时间(读时延),单位为ms
- rate
- write
- rate
每秒写I/O个数(写IOPS) - resp
写请求响应时间(写时延),单位为ms
- rate
- mb/sec
- read
每秒读取速度 - write
每秒写入速度 - total
每秒读写速度总和
- read
- xfersize
每个读写I/O传输数据量(即单个读写I/O大小),单位为字节B
块设备
1 | 测试参数如下: |
- interval
报告间隔序号,测试结果一般为除第一个时间时间外所有时间间隔加权平均值,如有设置预热时间,则这部分测试数据也需要排除在外
如elapsed=600,warmup=30,interval=5,则性能测试结果为第7个间隔到第126个间隔的平均值(avg_7-126) - i/o rate
每秒读写I/O个数(读写IOPS),可以通过rd
运行定义参数iorate
控制
当iorate
为max
时,以最大I/O速率运行工作负载
当iorate
为低于最大I/0速率的一个数值时,可以限制读写速度,以固定I/O速率运行工作负载 - MB/sec
每秒读写速度(读写带宽)
注:按官方手册说明, - bytes i/0
每个读写I/O传输数据量(即单个读写I/O大小),单位为字节B
,可以通过wd
工作负载定义参数xfersize
控制 - read pct
读取请求占请求总数的百分比,可以通过wd
工作负载定义参数rdpct
控制
当rdpct
为0
时,表示测试模型为写
当rdpct
为100
时,表示测试模型为读 - resp time
请求响应时间(读写时延),单位为毫秒ms
- read resp
读取请求响应时间,单位为毫秒ms
- write resp
写入请求响应时间,单位为毫秒ms
- resp max
最大请求响应时间,单位为毫秒ms
- resp stddev
请求响应时间标准偏差,单位为毫秒ms
- queue depth
读写I/0队列深度 - cpu% sys+u
内核态空间及用户态空间CPU占用率 - cpu% sys
内核态空间CPU占用率 2020年05月29日 16:00:16 Clear
测试说明
- 线程数(thread)一般设置为客户端CPU线程数总大小
grep 'processor' /proc/cpuinfo | sort -u | wc -l
- 测试总数据量需要为客户端内存大小两倍
- 测试读模型时需要清理客户端缓存信息
sync;echo 3 > /proc/sys/vm/drop