主流测试软件介绍

目前业内主流存储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。

注意:

  1. 存储性能测试时,埋数据使用vdbench比FIO效果好,推荐使用vdbench预埋数据。
  2. fio测试会对系统的硬盘进行读写,会存在破坏客户数据的风险,因此在生产环境上要谨慎使用,不建议对生产环境的硬盘进行裸盘读写测试。

主要测试指标

主要观测指标为 IOPSBW(带宽)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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
filename=/dev/emcpowerb 支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb
direct=1 测试过程绕过机器自带的buffer,使测试结果更真实
rw=randwread 测试随机读的I/O
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机混合写和读的I/O
rw=read 测试顺序读的I/O
rw=write 测试顺序写的I/O
rw=rw 测试顺序混合写和读的I/O
bs=4k 单次io的块文件大小为4k
bsrange=512-2048 同上,提定数据块的大小范围
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试
numjobs=30 本次的测试线程为30
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止
ioengine=psync io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel包
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息
此外
lockmem=1g 只使用1g内存进行测试
zero_buffers 用0初始化系统buffer
nrfiles=8 每个进程生成文件的数量

测试命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 块设备
# 100%随机,100%读,4K
fio -filename=/dev/vdb -direct=1 -iodepth 1 -thread -rw=randread -ioengine=libaio -bs=4k -size=100G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_4k

# 100%随机,100%写,4K
fio -filename=/dev/vdb -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=libaio -bs=4k -size=100G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k

# 100%顺序,100%读,4K
fio -filename=/dev/vdb -direct=1 -iodepth 1 -thread -rw=read -ioengine=libaio -bs=4k -size=100G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k

# 100%顺序,100%写,4K
fio -filename=/dev/vdb -direct=1 -iodepth 1 -thread -rw=write -ioengine=libaio -bs=4k -size=100G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k

# 100%随机,70%读,30%写,4K
fio -filename=/dev/vdb -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=libaio -bs=4k -size=100G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k

## 文件系统
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

测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[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
randrw_70read_4k: (g=0): rw=randrw, bs=(R) 8192B-8192B, (W) 8192B-8192B, (T) 8192B-8192B, ioengine=libaio, iodepth=1
...
fio-3.7
Starting 50 threads
randrw_70read_4k: Laying out IO file (1 file / 20480MiB)
Jobs: 50 (f=50): [m(50)][100.0%][r=34.0MiB/s,w=14.6MiB/s][r=4479,w=1870 IOPS][eta 00m:00s]
randrw_70read_4k: (groupid=0, jobs=50): err= 0: pid=20734: Tue Oct 19 08:23:18 2021
read: IOPS=1220, BW=9766KiB/s (10.0MB/s)(1717MiB/180059msec)
slat (usec): min=4, max=541, avg=12.04, stdev= 6.41
clat (usec): min=285, max=373689, avg=12109.21, stdev=37790.30
lat (usec): min=295, max=373699, avg=12122.49, stdev=37790.40
clat percentiles (usec):
| 1.00th=[ 537], 5.00th=[ 693], 10.00th=[ 783], 20.00th=[ 898],
| 30.00th=[ 996], 40.00th=[ 1090], 50.00th=[ 1172], 60.00th=[ 1287],
| 70.00th=[ 1450], 80.00th=[ 1713], 90.00th=[ 2933], 95.00th=[121111],
| 99.00th=[125305], 99.50th=[242222], 99.90th=[246416], 99.95th=[246416],
| 99.99th=[371196]
bw ( KiB/s): min= 15, max= 1152, per=2.01%, avg=196.73, stdev=169.43, samples=17870
iops : min= 1, max= 144, avg=24.54, stdev=21.18, samples=17870
write: IOPS=524, BW=4193KiB/s (4293kB/s)(737MiB/180059msec)
slat (usec): min=4, max=411, avg=12.92, stdev= 7.01
clat (usec): min=937, max=375705, avg=67132.23, stdev=69781.33
lat (usec): min=948, max=375726, avg=67146.41, stdev=69781.43
clat percentiles (usec):
| 1.00th=[ 1516], 5.00th=[ 1795], 10.00th=[ 1975], 20.00th=[ 2278],
| 30.00th=[ 2573], 40.00th=[ 3064], 50.00th=[ 77071], 60.00th=[115868],
| 70.00th=[121111], 80.00th=[123208], 90.00th=[125305], 95.00th=[127402],
| 99.00th=[248513], 99.50th=[250610], 99.90th=[362808], 99.95th=[371196],
| 99.99th=[375391]
bw ( KiB/s): min= 15, max= 528, per=2.01%, avg=84.17, stdev=71.04, samples=17918
iops : min= 1, max= 66, avg=10.47, stdev= 8.88, samples=17918
lat (usec) : 500=0.37%, 750=5.30%, 1000=15.88%
lat (msec) : 2=41.46%, 4=14.49%, 10=1.38%, 20=0.23%, 50=0.01%
lat (msec) : 100=0.77%, 250=19.94%, 500=0.18%
cpu : usr=0.03%, sys=0.09%, ctx=317534, majf=0, minf=56
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=219800,94367,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
READ: bw=9766KiB/s (10.0MB/s), 9766KiB/s-9766KiB/s (10.0MB/s-10.0MB/s), io=1717MiB (1801MB), run=180059-180059msec
WRITE: bw=4193KiB/s (4293kB/s), 4193KiB/s-4193KiB/s (4293kB/s-4293kB/s), io=737MiB (773MB), run=180059-180059msec

Disk stats (read/write):
vda: ios=219811/94366, merge=0/5, ticks=2658031/6335969, in_queue=6946443, util=77.28%

测试结果参数解析:

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

注意:

  1. 联机测试时,主节点要与其余节点做免密登录认证
  2. 在联机测试时,客户端的系统时间需保持一致,否则会出现时钟同步告警(this can lead to heartbeat issues)
  3. 客户端的防火墙要关闭(或者设置开放程序指定端口55705560访问)
  4. 关闭系统日志服务rsyslog,避免运行时出现其他日志文件打印信息
    参数文件添加messagescan=no可以过滤掉多余的系统日志

安装流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 安装Java
yum install -y java-1.8.0-openjdk

# 下载vdbench资源包
# 途径1:
# 链接:https://pan.baidu.com/s/1e9MHXtk6WauxMt1bTKNNrg
# 提取码:shwv
# 途径2:
# Oracle官网(需Oracle账户):https://www.oracle.com/downloads/server-storage/vdbench-downloads.html

# 解压vdbench
mkdir vdbench && mv vdbench50407.zip vdbench && cd vdbench && unzip vdbench50407.zip

# 测试vdbench
./vdbench -t

常用参数

  • 预埋数据
1
2
3
4
# 预埋数据量通常为卷容量的1.2倍
sd=sd1,lun=/dev/vdb,openflag=o_direct,threads=8
wd=wd1,sd=sd1,seekpct=0,rdpct=0,xfersize=1M
rd=rd1,wd=wd1,iorate=max,maxdata=120GB,elapse=604800,interval=2
  • 4M顺序写
    目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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、顺序读
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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/test02,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=read,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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

参数说明

vdbench可用于文件系统及块设备基准性能测试,以下主要介绍文件系统及块存储的常用测试参数
vdbench所有测试参数都定义到一个参数文件内,在运行时按照顺序被读取执行相应操作,在参数文件定义时需要执行顺序进行定义

文件系统

文件系统参数文件定义顺序为:HD、FSD、FWD、RD

  1. HD(Host Define)

非必选项,单机运行时不需要配置HD参数,一般只有在多主机联机测试时才需要配置

1
2
3
4
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= 可选值为rshsshvdbench,默认值为rsh,多主机联机测试时,mater和slave主机间通信方式
    当参数值为rsh时,需要配置master和slave主机rsh互信,考虑到rsh使用明文传输,安全级别不够,通常情况下不建议使用这种通信方式
    当参数值为ssh时,需要配置master和slave主机ssh互信,通常Linux主机联机时使用此通信方式
    当参数值为vdbench,需要在所有slave主机运行vdbench rsh启用vdbench本身的rsh守护进程,通常Window主机联机时使用此通信方式

  1. FSD(File System Define)
1
2
3
4
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= 标识文件系统定义的名称,多文件系统时(fsd1fsd2fsd3…),可以指定default(将相同的参数作为所有fsd的默认值)
  • anchor= 文件写入根目录
  • depth= 创建目录层级数(即目录深度)
  • width= 每层文件夹的子文件夹数
  • files= 测试文件个数(vdbench测试过程中会生成多层级目录结构,实际只有最后一层目录会生成测试文件)
  • size= 每个测试文件大小
  • **distribution= ** 可选值为bottomall,默认为bottom
    –当参数值为bottom时,程序只在最后一层目录写入测试文件
    –当参数值为all时,程序在每一层目录都写入测试文件
  • shared= 可选值为yesno,默认值为no,一般只有在多主机联机测试时指定
    vdbench不允许不同的slave之间共享同一个目录结构下的所有文件,因为这样会带来很大的开销,但是它们允许共享同一个目录结构。加入设置了shared=yes,那么不同的slave可以平分一个目录下所有的文件来进行访问,相当于每个slave有各自等分的访问区域,因此不能测试多个客户的对同一个文件的读写
    –当多主机联机测试时,写入的根目录anchor为同一个路径时,需要指定参数值为yes
1
2
3
4
5
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

 计算公式如下:
 最后一层生成文件夹个数=width^depth
 测试文件个数=(width^depth)*files

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
fsd=fsd1,anchor=/dir1,depth=2,width=3,files=2,size=128k
以上述参数为例,生成目录结构及测试文件如下:
最后一层文件夹数=3^2=9 最后一层文件数=9*2=18
/dir1/
├── no_dismount.txt
├── vdb.1_1.dir
│ ├── vdb.2_1.dir
│ │ ├── vdb_f0001.file
│ │ └── vdb_f0002.file
│ ├── vdb.2_2.dir
│ │ ├── vdb_f0001.file
│ │ └── vdb_f0002.file
│ └── vdb.2_3.dir
│ ├── vdb_f0001.file
│ └── vdb_f0002.file
├── vdb.1_2.dir
│ ├── vdb.2_1.dir
│ │ ├── vdb_f0001.file
│ │ └── vdb_f0002.file
│ ├── vdb.2_2.dir
│ │ ├── vdb_f0001.file
│ │ └── vdb_f0002.file
│ └── vdb.2_3.dir
│ ├── vdb_f0001.file
│ └── vdb_f0002.file
├── vdb.1_3.dir
│ ├── vdb.2_1.dir
│ │ ├── vdb_f0001.file
│ │ └── vdb_f0002.file
│ ├── vdb.2_2.dir
│ │ ├── vdb_f0001.file
│ │ └── vdb_f0002.file
│ └── vdb.2_3.dir
│ ├── vdb_f0001.file
│ └── vdb_f0002.file
└── vdb_control.file

12 directories, 20 files
  1. FWD(FileSystem Workload Defile)
1
2
3
4
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= 可选值为readwrite,文件操作方式

  • rdpct= 可选值为0~100,读操作占比百分比,一般混合读写时需要指定,当值为60时,则混合读写比为6:4

  • fileio= 可选值为randomsequential,标识文件 I/O 将执行的方式

  • fileselect= randomsequential,标识选择文件或目录的方式

  • xfersizes= 数据传输(读取和写入操作)处理的数据大小(即单次IO大小)

  • threads= 此工作负载的并发线程数量

  1. RD(Run Define)
1
rd=rd1,fwd=(fwd1-fwd3),fwdrate=max,format=restart,elapsed=604800,interval=10
  • rd= 标识文件系统运行定义的名称。
  • fwd= 标识文件系统工作负载定义的名称。
  • fwdrate= 每秒执行的文件系统操作数量。设置为max,表示不做任何限制,按照最大强度自适应
  • format= 可选值为yesnorestart,标识预处理目录和文件结构的方式
    –yes表示删除目录和文件结构再重新创建
    –no表示不删除目录和文件结构
    –restart表示只创建未生成的目录或文件,并且增大未达到实际大小的文件
  • elapsed= 默认值为30,测试运行持续时间(单位为秒)
  • interval= 结果输出打印时间间隔(单位为秒)

块设备

块设备参数文件定义顺序为:HD、SD、WD、RD

  1. HD(Host Define)

非必选项,单机运行时不需要配置HD参数,一般只有在多主机联机测试时才需要配置

1
2
3
4
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= 可选值为rshsshvdbench,默认值为rsh,多主机联机测试时,mater和slave主机间通信方式
    当参数值为rsh时,需要配置master和slave主机rsh互信,考虑到rsh使用明文传输,安全级别不够,通常情况下不建议使用这种通信方式
    当参数值为ssh时,需要配置master和slave主机ssh互信,通常Linux主机联机时使用此通信方式
    当参数值为vdbench,需要在所有slave主机运行vdbench rsh启用vdbench本身的rsh守护进程,通常Window主机联机时使用此通信方式

  1. SD(Storage Define)
1
2
3
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=sd6,hd=hd3,lun=/dev/sdb,openflags=o_direct,threads=6
  • sd= 标识存储定义的名称

  • hd= 标识主机定义的名称

  • lun= 写入块设备,如:/dev/sdb, /dev/sdc…

  • openflags= 通过设置为o_direct,以无缓冲缓存的方式进行读写操作

  • threads= 对SD的最大并发I/O请求数量

  1. WD(Workload Define)
1
2
3
4
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= 可选值为0100(也可使用sequentialrandom表示),默认值为100,随机寻道的百分比,设置为0时表示顺序,设置为100时表示随机。

  • rdpct= 读取请求占请求总数的百分比,设置为0时表示写,设置为100时表示读

  • xfersize= 要传输的数据大小。默认设置为4k

  • skew= 非必选项,一般在多个工作负载时需要指定,表示该工作负载占总工作量百分比(skew总和为100)

  1. RD(Run Define)
1
rd=rd1,wd=wd*,iorate=max,maxdata=400GB,warmup=30,elapse=604800,interval=5
  • rd= 标识运行定义的名称
  • wd= 标识工作负载定义的名称
  • iorate= 常用可选值为100max,此工作负载的固定I/O速率
    –当参数值为100时,以每秒100个I/Os的速度运行工作负载,当参数值设置为一个低于最大速率的值时,可以达到限制读写速度的效果
    –当参数值为max时,以最大的I/O速率运行工作负载,一般测试读写最大性能时,该参数值均为max
  • warmup= 预热时间(单位为秒),默认情况下vdbench会将第一个时间间隔输出数据排除在外,程序在预热时间内的测试不纳入最终测试结果中(即预热结束后,才开始正式测试)
    –当interval为5、elapsed为600时,测试性能为2elapsed/interval(avg_2-120)时间间隔内的平均性能
    –当interval为5、warmup为60、elapsed为600时,测试性能为1+(warmup/interval)
    (warmup+elapsed)/interval(avg_13-132)时间间隔内的平均性能
  • maxdata= 读写数据大小,通常情况下,当运行elapsed时间后测试结束;当同时指定elapsedmaxdata参数值时,以最快运行完的参数为准(即maxdata测试时间小于elapsed时,程序写完elapsed数据量后结束)
    –当参数值为100以下时,表示读写数据量为总存储定义大小的倍数(如maxdata=2,2个存储定义(每个存储定义数据量为100G),则实际读写数据大小为400G)
    –当参数值为100以上时,表示数据量为实际读写数据量(可以使用单位M、G、T等)
  • elapsed= 默认值为30,测试运行持续时间(单位为秒)
  • interval= 报告时间间隔(单位为秒)

运行使用

单机运行

  • Linux
    示例如下,单节点针对裸盘测试,1M顺序写,测试时间600s,预热时间60s,报告时间间隔2s
1
2
3
4
5
6
[root@node241 vdbench50406]# cat Single-RawDisk.html 
sd=sd1,lun=/dev/sdb,openflag=o_direct
wd=wd1,sd=sd1,seekpct=0,rdpct=0,xfersize=1M
rd=rd1,wd=wd1,iorate=max,warmup=60,elapsed=600,interval=2
[root@node241 vdbench50406]#
[root@node241 vdbench50406]# ./vdbench -f Single-RawDisk.html
  • Window
    示例如下,单节点针对文件系统测试,1M顺序写,目录深度为2,每层目录数为3,每个目录文件数为10,每个文件大小为200M,测试时间为600s,报告时间时间2s
1
2
3
4
5
6
7
E:\vdbench50406>more "Single FileSystem.txt"
fsd=fsd1,anchor=E:\Sigle-FileSystem,depth=2,width=3,files=10,size=200M
fwd=fwd1,fsd=fsd1,operation=write,xfersize=1M,fileio=sequential,fileselect=rando
m,threads=2
rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=600,interval=5
E:\vdbench50406>
E:\vdbench50406>vdbench -f "Single FileSystem.txt"

联机运行

  • Linux
    1. 配置多主机ssh互信
    2. master主机运行测试参数文件即可
      示例如下,三节点针对裸盘联机测试,1M顺序写,测试数据量为400G,预热时间30s,报告间隔5s
1
2
3
4
5
6
7
8
9
10
11
12
[root@node241 vdbench50406]# cat Multi-RawDisk
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node241
hd=hd2,system=node242
hd=hd3,system=node243
sd=sd1,hd=hd1,lun=/dev/sdb,openflag=o_direct
sd=sd2,hd=hd2,lun=/dev/sdb,openflag=o_direct
sd=sd3,hd=hd3,lun=/dev/sdb,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
[root@node241 vdbench50406]#
[root@node241 vdbench50406]# ./vdbench -f Multi-RawDisk
  • Window

    1. 所有slave主机运行vdbench本身rsh守护进程

      1
      E:\vdbench50406>vdbench rsh
    2. master主机运行测试参数文件即可

      示例如下,三节点针对文件系统联机测试,1M顺序写,目录深度为2,每层目录数为3,每个目录文件数为10000,每个文件大小为200M,测试时间为600s,报告间隔1s

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      E:\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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  ./vdbench parseflat -i <flatfile.html> -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.
  • histogram.html
    一种包含报告柱状图的响应时间、文本格式的文件
  • logfile.html
    包含 Java 代码写入控制台窗口的每行信息的副本。logfile.html 主要用于调试用途
  • parmfile.html
    包含测试运行配置参数信息
  • summary.html
    记录全部数据信息,显示每个报告间隔内总体性能情况及工作负载情况,以及除第一个间隔外的所有间隔的加权平均值
  • totals.html
    记录全部数据计算之后的平均值,一般测试结果从该文件取值,除第一个间隔外所有间隔的加权平均值

结果分析

文件系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#测试参数如下:
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=10,size=4M
fsd=fsd2,anchor=Z:\Sigle-FileSystem-02,depth=2,width=3,files=10,size=4M
fwd=default,operation=write,xfersize=1M,fileio=sequential,fileselect=random,threads=2
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd2,host=hd2
rd=rd1,fwd=fwd*,fwdrate=max,format=yes,elapsed=600,interval=5

#测试结果如下:
18:47:03.001 Starting RD=format_for_rd1

六月 04, 2020 .Interval. .ReqstdOps... ...cpu%... read ....read..... ....write.... ..mb/sec... mb/sec .xfer.. ...mkdir.... ...rmdir.... ...create... ....open.... ...close.... ...delete...
rate resp total sys pct rate resp rate resp read write total size rate resp rate resp rate resp rate resp rate resp rate resp
18:48:40.218 avg_2-20 57.6 6.244 13.4 2.99 0.0 0.0 0.000 57.6 6.244 0.00 7.20 7.20 131072 0.2 104.49 0.2 41.526 1.8 7527.0 1.8 192.01 1.8 7134.3 1.8 21.984

18:48:42.000 Starting RD=rd1; elapsed=600; fwdrate=max. For loops: None

18:58:42.205 avg_2-120 6.2 1.063 13.0 2.80 0.0 0.0 0.000 6.2 1.063 0.00 6.24 6.24 1048576 0.0 0.000 0.0 0.000 0.0 0.000 1.6 47.864 1.6 2401.1 0.0 0.000

totals.html一般包括两个部分,第一部分为文件存储目录结构及数据填充的平均性能值,第二部分为执行测试过程中除第一个时间间隔外所有时间间隔平均性能值,主要看第二部分的内容

  • Interval
    报告间隔序号,测试结果一般为除第一个时间间隔外所有时间间隔加权平均值
    如elapsed=600,interval=5,则性能结果为第2个间隔到第120个间隔的平均值(avg_2-120)
  • ReqstdOps
    • rate
      每秒读写I/O个数(读写IOPS),可以通过rd运行定义参数fwdrate控制
      fwdratemax时,以最大I/O速率运行工作负载
      fwdrate为低于最大I/0速率的一个数值时,可以限制读写速度,以固定I/O速率运行工作负载
    • resp
      读写请求响应时间(读写时延),单位为ms
  • cpu%
    • tatol
      总的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
块设备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#测试参数如下:
messagescan=no
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node241
hd=hd2,system=node242
hd=hd3,system=node243
sd=sd1,hd=hd1,lun=/dev/sdb,openflag=o_direct
sd=sd2,hd=hd2,lun=/dev/sdb,openflag=o_direct
sd=sd3,hd=hd3,lun=/dev/sdb,openflag=o_direct
wd=wd1,sd=sd*,seekpct=0,rdpct=0,xfersize=1M
rd=rd1,wd=wd1,iorate=max,elapsed=600,warmup=30,interval=5

#测试结果如下:
<a name="_1143839598"></a><i><b>19:02:15.001 Starting RD=rd1; I/O rate: Uncontrolled MAX; elapsed=600 warmup=30; For loops: None</b></i>

Jun 04, 2020 interval i/o MB/sec bytes read resp read write resp resp queue cpu% cpu%
rate 1024**2 i/o pct time resp resp max stddev depth sys+u sys
19:12:46.068 avg_7-126 82.74 82.74 1048576 0.00 289.158 0.000 289.158 2092.803 155.103 23.9 16.3 14.2
  • interval
    报告间隔序号,测试结果一般为除第一个时间时间外所有时间间隔加权平均值,如有设置预热时间,则这部分测试数据也需要排除在外
    如elapsed=600,warmup=30,interval=5,则性能测试结果为第7个间隔到第126个间隔的平均值(avg_7-126)
  • i/o rate
    每秒读写I/O个数(读写IOPS),可以通过rd运行定义参数iorate控制
    ioratemax时,以最大I/O速率运行工作负载
    iorate为低于最大I/0速率的一个数值时,可以限制读写速度,以固定I/O速率运行工作负载
  • MB/sec
    每秒读写速度(读写带宽
    注:按官方手册说明,
  • bytes i/0
    每个读写I/O传输数据量(即单个读写I/O大小),单位为字节B,可以通过wd工作负载定义参数xfersize控制
  • read pct
    读取请求占请求总数的百分比,可以通过wd工作负载定义参数rdpct控制
    rdpct0时,表示测试模型为写
    rdpct100时,表示测试模型为读
  • 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

测试说明

  1. 线程数(thread)一般设置为客户端CPU线程数总大小 grep 'processor' /proc/cpuinfo | sort -u | wc -l
  2. 测试总数据量需要为客户端内存大小两倍
  3. 测试读模型时需要清理客户端缓存信息 sync;echo 3 > /proc/sys/vm/drop

参考文档