目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。
fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。
如下是在Linux系统上采用fio工具来对SAN存储进行的IO测试。
1)下载Fio源码。
wget https://github.com/axboe/fio/archive/fio-2.1.10.tar.gz
2)解压Fio源码。
tar -zxvf fio-2.1.10.tar.gz
3)编译并安装Fio。
cd fio-fio-2.1.10
make
make install
4)检查安装的Fio版本号。
fio --version
5)回显信息如下,则Fio安装成功。
fio-2.1.10
4.测试已完成编译的软件
以读带宽为例,测试Fio是否可以正常使用。
执行以下命令:
fio --filename=/tmp/test_read -direct=1 -rw=read -bs=1m -size=1G -numjobs=4 -runtime=10 -group_reporting -name=mytest
回显信息如下,若能正常显示磁盘读速率,则表示Fio可正常使用。
mytest: (g=0): rw=read, bs=1M-1M/1M-1M/1M-1M, ioengine=sync, iodepth=1
...
fio-2.1.10
Starting 4 processes
mytest: Laying out IO file(s) (1 file(s) / 1024MB)
Jobs: 4 (f=4): [RRRR] [100.0% done] [150.0MB/0KB/0KB /s] [150/0/0 iops] [eta 00m:00s]
mytest: (groupid=0, jobs=4): err= 0: pid=20659: Sat Jul 6 18:00:27 2019
read : io=1587.0MB, bw=153195KB/s, iops=149, runt= 10608msec
clat (msec): min=1, max=869, avg=26.72, stdev=133.87
lat (msec): min=1, max=869, avg=26.72, stdev=133.87
clat percentiles (msec):
| 1.00th=[ 3], 5.00th=[ 3], 10.00th=[ 3], 20.00th=[ 4],
| 30.00th=[ 4], 40.00th=[ 4], 50.00th=[ 5], 60.00th=[ 5],
| 70.00th=[ 5], 80.00th=[ 6], 90.00th=[ 7], 95.00th=[ 8],
| 99.00th=[ 848], 99.50th=[ 857], 99.90th=[ 865], 99.95th=[ 873],
| 99.99th=[ 873]
bw (KB /s): min=36283, max=40487, per=25.04%, avg=38354.52, stdev=879.60
lat (msec) : 2=0.57%, 4=47.20%, 10=48.20%, 20=1.13%, 50=0.13%
lat (msec) : 500=0.25%, 1000=2.52%
cpu : usr=0.05%, sys=0.15%, ctx=1599, majf=0, minf=84
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=1587/w=0/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=1587.0MB, aggrb=153194KB/s, minb=153194KB/s, maxb=153194KB/s, mint=10608msec, maxt=10608msec
Disk stats (read/write):
vda: ios=1602/4, merge=31/7, ticks=42550/0, in_queue=12010, util=34.53%
yum install fio
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 每个进程生成文件的数量
-direct=1 /*定义是否使用direct IO,可选值如下:值为0,表示使用buffered IO;值为1,表示使用 direct IO,测试过程绕过机器自带的buffer。使测
试结果更真实。*/
-iodepth=64 /*定义测试时的IO队列深度,默认为1。此处定义的队列深度是指每个线程的队列深度, 如果有多个线程测试,意味着每个线程都是此处定义的队列深
度。fio总的IO并发数 =iodepth * numjobs*/
-rw=randwrite /*定义测试时的读写策略,可选值如下:随机读:randread,随机写:randwrite,顺序读: read,顺序写:write,混合随机读写:randrw
-bs=4k /*定义IO的块大小(block size),单位是k、K、m和M等,默认IO块大小为4 KB*/
-size=100M /*定义测试IO操作的数据量,若未指定runtime这类参数,fio会将指定大小的数据量全部 读/写完成,然后才停止测试。该参数的值,可以是带单位
的数字,比如size=10G,表示读/写的数据量为10GB;也可是百分数,比如size=20%,表示读/写的数据量占该设备总文件的20%的空间。建议测试
数据量为内存两倍大,尽量避免缓存影响。*/
-numjobs=1 /*每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。 */
-runtime /*定义测试时间。如果未配置,则持续将size指定的文件大小,以每次bs值为分块大小读/ 写完。*/
-group_reporting /*定义测试结果显示模式,group_reporting 表示汇总每个进程的统计信息,而非以不同 job汇总展示信息。*/
-filename=/dev/sdb1 /*测试文件名称,通常选择需要测试的盘的data目录。*/
-ioengine=libaio /*libaio指的是异步模式,如果是同步就要用sync。
vsync - 使用 readv / writev,主要是会将相邻的 I/O 进行合并
psync - 对应的 pread / pwrite,增量同步,一般sync是全量的
pvsync / pvsync2 - 对应的 preadv / pwritev,以及 preadv2 / p writev2
定义fio如何下发IO请求,通常有同步IO和异步IO:同步IO一次只能发出一个IO请求, 等待内核完成后才返回。这样对于单个线程IO队列深度总是小 于1,但是可以透过多个线程并发执行来解决。通常会用16~32个线程同时工作把IO队列深度塞满。异步IO则通常使用libaio这样的方式一次提交一批 IO 请求,然后等待一批的完成,减少交互的次数,会更有效率*/
-thread /*使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。*/
–numjobs=1 /*定义测试的并发线程数*/
-filename /*定义测试文件(设备)的名称。此处选择文件,则代表测试文件系统的性能,例如:- filename=/opt/fiotest/fiotest.txt;此处选择设备名 称,则代表测试裸盘的性能,例:-filename=/dev/vdb1。如果在已经分区、并创建文件系统,且已写入数据的磁盘上进行性能测试,请注意
filename选择指定文件,以避免覆盖文件系统和原有数据。*/
-size=100M /*定义测试IO操作的数据量,若未指定runtime这类参数,fio会将指定大小的数据量全部 读/写完成,然后才停止测试。该参数的值,可以是带单位 的数字,比如size=10G,表示读/写的数据量为10GB;也可是百分数,比如size=20%,表示读/写的数据量占该设备总文件的20%的空间。建议测试 数据量为内存两倍大,尽量避免缓存影响。*/
-name=job1 /*定义测试任务名称。*/
–output TestResult.log /*日志输出到TestResult.log。*/
-rwmixwrite=30 /*在混合读写的模式下,写占30% */
-lockmem=1g /*只使用1g内存进行测试。 */
-zero_buffers /*用0初始化系统buffer。*/
-nrfiles=8 /*每个进程生成文件的数量。*/
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_4k100%随机,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_4k100%顺序,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_4k100%顺序,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_4k100%随机,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=1Run 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=180113msecDisk 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=磁盘利用率
1. Read=100% Ramdon=100% rw=randread (100%随机读)
2. Read=100% Sequence=100% rw=read (100%顺序读)
3. Write=100% Sequence=100% rw=write (100%顺序写)
4. Write=100% Ramdon=100% rw=randwrite (100%随机写)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30(70%顺序读,30%顺序写)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30(70%随机读,30%随机写)
[root@tydb010 data2]# fio -direct=1 -iodepth=1 -thread -rw=randrw -rwmixread=70 -ioengine=libaio -bs=4k -size=4G -numjobs=30 -runtime=60 -group_reporting -filename=/data2/1.txt -name=Write_BandWidth_Test
Write_BandWidth_Test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
fio-3.14
Starting 30 threads
Write_BandWidth_Test: Laying out IO file (1 file / 4096MiB)
Jobs: 30 (f=30): [m(30)][100.0%][r=24.2MiB/s,w=10.5MiB/s][r=6206,w=2692 IOPS][eta 00m:00s]
Write_BandWidth_Test: (groupid=0, jobs=30): err= 0: pid=11155: Mon Jun 13 16:38:40 2022
read: IOPS=6381, BW=24.9MiB/s (26.1MB/s)(1496MiB/60008msec)
slat (usec): min=39, max=647909, avg=379.86, stdev=9733.94
clat (nsec): min=604, max=379829k, avg=3132927.68, stdev=8833769.30
lat (usec): min=68, max=647913, avg=3526.35, stdev=13178.41
clat percentiles (nsec):
| 1.00th=[ 1608], 5.00th=[ 1928], 10.00th=[ 2512],
| 20.00th=[ 37632], 30.00th=[ 50432], 40.00th=[ 2113536],
| 50.00th=[ 2375680], 60.00th=[ 2605056], 70.00th=[ 2867200],
| 80.00th=[ 3391488], 90.00th=[ 5668864], 95.00th=[ 8224768],
| 99.00th=[ 21364736], 99.50th=[ 38010880], 99.90th=[147849216],
| 99.95th=[183500800], 99.99th=[265289728]
bw ( KiB/s): min= 4291, max=38895, per=99.42%, avg=25377.61, stdev=182.49, samples=3585
iops : min= 1067, max= 9711, avg=6339.06, stdev=45.63, samples=3585
write: IOPS=2738, BW=10.7MiB/s (11.2MB/s)(642MiB/60008msec)
slat (usec): min=47, max=647261, avg=461.69, stdev=10445.88
clat (nsec): min=659, max=411384k, avg=2215531.55, stdev=8180669.00
lat (usec): min=75, max=647264, avg=2695.71, stdev=13337.17
clat percentiles (nsec):
| 1.00th=[ 1656], 5.00th=[ 1944], 10.00th=[ 2416],
| 20.00th=[ 3152], 30.00th=[ 33536], 40.00th=[ 37632],
| 50.00th=[ 50432], 60.00th=[ 2539520], 70.00th=[ 2834432],
| 80.00th=[ 3194880], 90.00th=[ 4112384], 95.00th=[ 5799936],
| 99.00th=[ 12255232], 99.50th=[ 20578304], 99.90th=[147849216],
| 99.95th=[183500800], 99.99th=[258998272]
bw ( KiB/s): min= 2005, max=18017, per=99.41%, avg=10889.09, stdev=86.89, samples=3585
iops : min= 494, max= 4495, avg=2715.49, stdev=21.73, samples=3585
lat (nsec) : 750=0.01%, 1000=0.01%
lat (usec) : 2=5.71%, 4=13.53%, 10=0.09%, 20=0.03%, 50=16.59%
lat (usec) : 100=1.31%, 250=0.02%, 500=0.09%, 750=0.07%, 1000=0.12%
lat (msec) : 2=4.10%, 4=43.46%, 10=11.89%, 20=2.03%, 50=0.58%
lat (msec) : 100=0.16%, 250=0.20%, 500=0.01%
cpu : usr=0.21%, sys=3.11%, ctx=344789, majf=0, minf=37
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=382937,164339,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=24.9MiB/s (26.1MB/s), 24.9MiB/s-24.9MiB/s (26.1MB/s-26.1MB/s), io=1496MiB (1569MB), run=60008-60008msec
WRITE: bw=10.7MiB/s (11.2MB/s), 10.7MiB/s-10.7MiB/s (11.2MB/s-11.2MB/s), io=642MiB (673MB), run=60008-60008msec
Disk stats (read/write):
sdc: ios=382060/163979, merge=0/12, ticks=41077/19349, in_queue=60391, util=98.77%
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=磁盘利用率