IO常用测试工具

FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。

目前主流的第三方IO测试工具有fio、iometer 和 Orion,这三种工具各有千秋,在linux 下也可以使用dd 进行简单的磁盘(文件系统)测试(文末补充)。

fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。

FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试);

如下是在Linux系统上采用fio工具来对SAN存储进行的IO测试。

1、安装fio

在fio官网下载fio-2.1.10.tar文件,解压后./configure、make、make install之后就可以使用fio了。

2、fio参数解释

可以使用fio -help查看每个参数,具体的参数左右可以在官网查看how to文档,如下为几个常见的参数描述

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                每个进程生成文件的数量

3、fio测试场景及生成报告详解

测试场景:

100%随机,100%读, 4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_4k

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

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

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

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

结果报告查看:

[root@rac01-node02]# fio -filename=/dev/sdc4 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k_local
randrw_70read_4k_local: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=psync, iodepth=1
...
fio-2.1.10
Starting 50 threads
Jobs: 21 (f=21): [____m____m_m___m____mmm__mmm__mm_m_mmm_m__m__m_m_m] [3.4% done] [7004KB/2768KB/0KB /s] [1751/692/0 iops] [eta 01h:27m:00s]
randrw_70read_4k_local: (groupid=0, jobs=50): err= 0: pid=13710: Wed May 31 10:23:31 2017
  read : io=1394.2MB, bw=7926.4KB/s, iops=1981, runt=180113msec
    clat (usec): min=39, max=567873, avg=24323.79, stdev=25645.98
     lat (usec): min=39, max=567874, avg=24324.23, stdev=25645.98
    clat percentiles (msec):
     |  1.00th=[    3],  5.00th=[    5], 10.00th=[    6], 20.00th=[    7],
     | 30.00th=[    9], 40.00th=[   12], 50.00th=[   16], 60.00th=[   21],
     | 70.00th=[   27], 80.00th=[   38], 90.00th=[   56], 95.00th=[   75],
     | 99.00th=[  124], 99.50th=[  147], 99.90th=[  208], 99.95th=[  235],
     | 99.99th=[  314]
    bw (KB  /s): min=   15, max=  537, per=2.00%, avg=158.68, stdev=38.08
  write: io=615280KB, bw=3416.8KB/s, iops=854, runt=180113msec
    clat (usec): min=167, max=162537, avg=2054.79, stdev=7665.24
     lat (usec): min=167, max=162537, avg=2055.38, stdev=7665.23
    clat percentiles (usec):
     |  1.00th=[  201],  5.00th=[  227], 10.00th=[  249], 20.00th=[  378],
     | 30.00th=[  548], 40.00th=[  692], 50.00th=[  844], 60.00th=[  996],
     | 70.00th=[ 1160], 80.00th=[ 1304], 90.00th=[ 1720], 95.00th=[ 3856],
     | 99.00th=[40192], 99.50th=[58624], 99.90th=[98816], 99.95th=[123392],
     | 99.99th=[148480]
    bw (KB  /s): min=    6, max=  251, per=2.00%, avg=68.16, stdev=29.18
    lat (usec) : 50=0.01%, 100=0.03%, 250=3.15%, 500=5.00%, 750=5.09%
    lat (usec) : 1000=4.87%
    lat (msec) : 2=9.64%, 4=4.06%, 10=21.42%, 20=18.08%, 50=19.91%
    lat (msec) : 100=7.24%, 250=1.47%, 500=0.03%, 750=0.01%
  cpu          : usr=0.07%, sys=0.21%, ctx=522490, majf=0, minf=7
  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    : total=r=356911/w=153820/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: io=1394.2MB, aggrb=7926KB/s, minb=7926KB/s, maxb=7926KB/s, mint=180113msec, maxt=180113msec
  WRITE: io=615280KB, aggrb=3416KB/s, minb=3416KB/s, maxb=3416KB/s, mint=180113msec, maxt=180113msec

Disk stats (read/write):
  sdc: ios=356874/153927, merge=0/10, ticks=8668598/310288, in_queue=8978582, util=99.99%

io=执行了多少M的IO

bw=平均IO带宽
iops=IOPS
runt=线程运行时间
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 latencies=IO完延迟的分布

io=总共执行了多少size的IO
aggrb=group总带宽
minb=最小.平均带宽.
maxb=最大平均带宽.
mint=group中线程的最短运行时间.
maxt=group中线程的最长运行时间.

ios=所有group总共执行的IO数.
merge=总共发生的IO合并数.
ticks=Number of ticks we kept the disk busy.
io_queue=花费在队列上的总共时间.
util=磁盘利用率

4、扩展之IO队列深度

在某个时刻,有N个inflight的IO请求,包括在队列中的IO请求、磁盘正在处理的IO请求。N就是队列深度。
加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。
加大队列深度 -> 提高利用率 -> 获得IOPS和MBPS峰值 ->注意响应时间在可接受的范围内,
增加队列深度的办法有很多,使用异步IO,同时发起多个IO请求,相当于队列中有多个IO请求,多线程发起同步IO请求,相当于队列中有多个IO请求。
增大应用IO大小,到达底层之后,会变成多个IO请求,相当于队列中有多个IO请求 队列深度增加了。
队列深度增加了,IO在队列的等待时间也会增加,导致IO响应时间变大,这需要权衡。

为何要对磁盘I/O进行并行处理呢?主要目的是提升应用程序的性能。这一点对于多物理磁盘组成的虚拟磁盘(或LUN)显得尤为重要。
如果一次提交一个I/O,虽然响应时间较短,但系统的吞吐量很小。
相比较而言,一次提交多个I/O既缩短了磁头移动距离(通过电梯算法),同时也能够提升IOPS。
假如一部电梯一次只能搭乘一人,那么每个人一但乘上电梯,就能快速达到目的地(响应时间),但需要耗费较长的等待时间(队列长度)。
因此一次向磁盘系统提交多个I/O能够平衡吞吐量和整体响应时间。

Linux系统查看默认队列深度:

[root@qsdb ~]# lsscsi -l
[0:0:0:0]    disk    DGC      VRAID            0533  /dev/sda 
  state=running queue_depth=30 scsi_level=5 type=0 device_blocked=0 timeout=30
  state=running queue_depth=1 scsi_level=6 type=5 device_blocked=0 timeout=30

使用dd命令设置bs=2M进行测试:

dd if=/dev/zero of=/dev/sdd bs=2M count=1000 oflag=direct

记录了1000+0 的读入 记录了1000+0 的写出 2097152000字节(2.1 GB)已复制,10.6663 秒,197 MB/秒

Device: rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s   avgrq-sz   avgqu-sz   await   svctm   %util
sdd      0.00     0.00   0.00  380.60  0.00    389734.40  1024.00  2.39       6.28    2.56    97.42

可以看到2MB的IO到达底层之后,会变成多个512KB的IO,平均队列长度为2.39,这个硬盘的利用率是97%,MBPS达到了197MB/s。
(为什么会变成512KB的IO,你可以去使用Google去查一下内核参数 max_sectors_kb的意义和使用方法 )也就是说增加队列深度,是可以测试出硬盘的峰值的。

5、Linux系统中查看IO命令iostat详解

[root@rac01-node01 /]# iostat -xd 3
Linux 3.8.13-16.2.1.el6uek.x86_64 (rac01-node01)     05/27/2017     _x86_64_    (40 CPU)
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.05     0.75    2.50    0.50    76.59    69.83    48.96     0.00    1.17   0.47   0.14
scd0              0.00     0.00    0.02    0.00     0.11     0.00     5.25     0.00   21.37  20.94   0.05

输出参数描述:

rrqms:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:The number of sectors read from the device per second.
wsec/s:The number of sectors written to the device per second.
rKB/s:The number of kilobytes read from the device per second.
wKB/s:The number of kilobytes written to the device per second.
avgrq-sz:平均请求扇区的大小,The average size (in sectors) of the requests that were issued to the device.
avgqu-sz:是平均请求队列的长度。毫无疑问,队列长度越短越好,The average queue length of the requests that were issued to the device.   
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。 svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好。
如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。 %util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,
所以该参数暗示了设备的繁忙程度,一般地,如果该参数是100%表示磁盘设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)

 

IOmeter通过Dynamo来生成多种IO测试,每一个Dynamo叫做一个Managere。每一个Manager下又有多个worker,worker即时Dynamo的线程,比如worker1用于测试磁盘IO,worker2用户测试网络的IO。IOmeter的界面如下: 

 在linux下使用IOmeter由于没有UI,所以需借助windows下的UI,首先下载linux下的IOmeter,进入src目录后,一般有一个dynamo执行程序,执行以下命令:

./dynamo -i windows主机ip -m linux主机ip ;

然后下载windows的IOmeter,安装完成之后在windows下启动IOmeter,就能看到Linux下的磁盘,如上图test4所示。。

测试步骤大致如下:

1)添加一个worker,自动命名为worker1.(黄色图表表示逻辑盘,如果是物理磁盘,图表为蓝色);

2)选择要测试的磁盘 ,比如sdb;

3)在 “Access Specifications” 页面中选择default并添加至左侧栏内,default的设置可以通过edit调整。

4)在“Results Display”页面选择页面更新频率,一般选择5s到10s刷新一次。

5)在“Test Setup”页面可以设置测试的时间以及其他一些复杂躬耕,时间一般设为5min。

6)点击绿色小旗按钮开始测试。

【dd工具】
操作系统: ubuntu 12.04
测试工具: dd 版本:8.21 执行dd --version来查看
工具说明:

dd命令能粗略测试硬盘IO性能
不足:执行dd命令测试硬盘IO性能,对硬盘的损害很大,不建议多次或长时间尝试.
测试命令:
1) 读测试
root@localhost:/# time dd if=/dev/sdf of=/dev/null bs=8k count=100000
10000+0 records in
10000+0 records out
10485760000 bytes (10 GB) copied, 26.524 s, 395 MB/s
real 0m26.526s
user 0m0.008s
sys 0m5.364s


2) 写测试
root@localhost:~$ time dd if=/dev/zero of=/mnt/ssd/w.bat bs=8k count=100000
100000+0 records in
100000+0 records out
819200000 bytes (819 MB) copied, 1.60734 s, 510 MB/s
real 0m1.610s
user 0m0.016s
sys 0m1.588s


3) 读写测试
root@localhost:~# time dd if=/dev/sdb of=/mnt/ssd/rw.bat bs=8k count=100000
100000+0 records in
100000+0 records out
819200000 bytes (819 MB) copied, 12.1117 s, 67.6 MB/s
real 0m12.118s
user 0m0.044s
sys 0m2.436s

其他说明: 后面有个参数比如:oflag=dsync
完整命令: time dd if=/dev/sdb of=/mnt/ssd/rw.bat bs=8k count=100000 oflag=dsync
加入这个参数后,dd在执行时每次都会进行同步写入操作。也就是说,这条命令每次读取8k后就要先把这8k写入磁盘,然后再读取下面这8k,一共重复10万次。这可能是最慢的一种方式了,因为基本上没有用到写缓存(write cache)。加此参数后,测试最严格的,可以模拟数据库的插入操作,所以很慢,可能更接近真实.


【fio工具】

操作系统: ubuntu 12.04
测试工具: fio
测试条件: 需安装,执行命令: apt-get install fio

工具说明: 以顺序读为例子,命令如下:fio -name iops -rw=read -bs=4k -runtime=60 -iodepth 32 -filename /dev/sdf -ioengine libaio -direct=1, 其中rw=read表示随机读,bs=4k表示每次读4k,filename指定对应的分区,这里我是/dev/sdf,direct=1表示不借助缓存
测试命令:
1) 顺序读
# fio -name iops -rw=read -bs=4k -runtime=60 -iodepth 32 -filename /dev/sdf -ioengine libaio -direct=1
2) 顺序写
# fio -name iops -rw=write -bs=4k -runtime=60 -iodepth 32 -filename /dev/sdf -ioengine libaio -direct=1
3) 随机读
# fio -name iops -rw=randread -bs=4k -runtime=60 -iodepth 32 -filename /dev/sdf -ioengine libaio -direct=1
4) 随机写
# fio -name iops -rw=randwrite -bs=4k -runtime=60 -iodepth 32 -filename /dev/sdf -ioengine libaio -direct=1


其他说明:
1) fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap,libaio,posixaio,SG v3,splice,null,network,syslet, guasi, solarisaio
2) 其他非ubuntu操作系统安装说明
wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz
yum install libaio-devel
tar -zxvf fio-2.2.5.tar.gz
cd fio-2.2.5
make && make install
【IOMeter工具】

操作系统: ubuntu 12.04
测试工具: IOMeter 1.10
工具说明: IOMeter是一款功能非常强大的IO测试软件,它除了可以在本机运行测试本机的IO(磁盘)性能之外,还提供了模拟网络应用的能力
测试步骤:
1. 从Iometer官方网站 http://www.iometer.org/ 得到安装文件

2. Windowns机器上安装iometer-1.1.0-win32.i386-setup.exe,点下一步安装即可

3. Linux主机上下载并解压:tar -jxvf iometer-1.1.0-linux.x86_64-bin.tar.bz2

4. Linux主机上运行./dynamo -i 127.0.0.1 -m 127.0.0.2 (1:WINDOWS主机,2:LINUX主机)
5. iometer使用

1) 在Disk Targets目录下,设置测试的磁盘为(localhost --> /mnt/ssd),为所有工作机组都选择该磁盘

2) 在Access Specifications目录下为所有工作组选择测试项目(可选默认的,也可添加自定义条件)

3) 在results display目录下,选择update frequency频率为1点击开始测试

4) 点击开始测试 ,等待10分钟,OK

vdbench简介
vdbench 是一个磁盘I/O负载生成器,主要用于基准测试和存储产品的测试。

vdbench 是由java语言编写的,由oracle公司开发。

可以使用vdbench测试磁盘和文件系统的读写性能。

这个工具有以下优点:

1、能够每秒显示整个测试的io叠加,这样测试整个集群的io的时候,可以把所有虚机启动起来,然后进行io的压测,而不是去压单个rbd的iops,那个没有太大的意义,只能是一个数值,真正的环境大多也不是给一个业务使用的,也可以跑起一个业务以后,再看剩余的机器还能跑多少性能
2、在测试输出报告里面会根据主机统计一次io,这个面向的业务场景就是,比如某台主机上面可能挂载多块云盘,那么可以根据主机进行统计
3、在报告里面还会根据设备显示io个延时的信息,也就是只要是测试设备,每一个的性能指标都能查到,这个的好处就是检测集群里面的io是不是均匀的,如果做了qos,设备的测试性能值是不是跟设置限制一样

本文链接:https://www.codercto.com/a/49559.html

与fio的区别

这个比fio强大的是,既能够测试块接口也能测试文件接口,文件接口是去模拟写入文件,这个又和mdtest类似,但是mdtest主要是去测试元数据能力,vdbench则比较综合。

windows下载地址:

https://www.oracle.com/downloads/server-storage/vdbench-downloads.html

使用方法
下载 https://www.oracle.com/downloads/server-storage/vdbench-downloads.html

解压,文件夹中的vdbench.bat是个windows用,vdbench 给linux用。

使用方法:

1、编写脚本(或叫做配置文件)

这部分可以参考解压后的examples⽂件夹下的脚本,⽐如create_files;也可以参考output⽬录下的parmfile.html

fsd=fsd1,anchor=/dir,depth=1,width=1,files=10000,size=8k
fwd=fwd1,fsd=fsd1,operation=read,threads=16
rd=rd1,fwd=fwd*,fwdrate=100,format=yes,elapsed=5,interval=1

注:(1)anchor=/dir 这个需要把路径换成你ceph挂载的路径,我的是anchor=/home/baymax/cephfs

2、运行vdbench按脚本执行
./vdbench -f examples/filesys/create_files -jn
其中-jn是为了做数据校验,⽬前还不太懂。


3、输出结果

注意事项
在联机测试时,客户端的系统时间需保持一致,否则会出现时钟同步告警(this can lead to heartbeat issues)
客户端的防火墙要关闭(或者设置开放程序指定端口5570、5560访问)
关闭系统日志服务rsyslog,避免运行时出现其他日志文件打印信息
参数文件添加messagescan=no可以过滤掉多余的系统日志
常用执行选项和参数文件说明
vdbench 测试工具涉及到的参数非常多,这些参数可以分为 块存储 和 文件系统 两部分,每 部分又是按组进行划分的。 所有的参数都需要定义到一个参数文件当中,在被读取的时候都是按顺序进行的,所以在定义 时需要按指定的顺序进行定义。

块存储参数文件的定义顺序: HD, SD, WD, RD

文件系统参数文件的定义顺序: HD, FSD, FWD, RD

参考:https://blog.csdn.net/bandaoyu/article/details/121568182

 

posted @ 2024-03-20 09:58  konglingbin  阅读(637)  评论(0编辑  收藏  举报