FIO – IO压力测试工具


        FIO是一个开源的I/O压力测试工具,主要是用来测试磁盘/SSD的IO性能,也可测试cpu,nic的IO性能。它可以支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, network, syslet, guasi, solarisaio, I/Opriorities (针对新的Linux内核), rate I/O, forked or threaded jobs等。

官网地址:http://freecode.com/projects/fio

        FIO,使用简单,支持的文件操作非常多,基本可以覆盖到常用的的文件使用方式。

1  软件安装

1. 下载源码

官网或http://download.csdn.net/detail/iamonlyme/9832236

2. 编译

fio的一些特性依赖zlib-devel,建议先安装zlib-devel。

 

# tar -jxvf fio-2.14.tar.bz2

# cd fio-2.14/

#./configure

Operating system              Linux

CPU                           x86_64

Big endian                    no

Compiler                      gcc

Static Assert                 yes

bool                          yes

# make

# make install

 

2  参数介绍

2.1     命令格式

fio -filename=<测试文件或块设备> -ioengine=sync -direct=1 -rw=randread -bs=8k -size=1G -numjobs=8 -runtime=10-group_reporting -name=fio_test

 

2.2     参数解析

2.2.1      filename

待测试的文件或块设备。

若为文件,则代表测试文件系统的性能;例:-filename=/work/fstest/fio.img

若为块设备,则代表测试裸设备的性能; 例:-filename=/dev/sdb1

 

2.2.2  ioengine

采用的文件读写方式

sync:采用read,write,使用fseek定位读写位置。

psync:采用pread、pwrite进行文件读写操作

vsync:采用readv(2) orwritev(2)进行文件读写操作,

注:read()write()系统调用每次在文件和进程的地址空间之间传送一块连续的数据。但是,应用有时也需要将分散在内存多处地方的数据连续写到文件中,或者反之。在这种情况下,如果要从文件中读一片连续的数据至进程的不同区域,使用read()则要么一次将它们读至一个较大的缓冲区中,然后将它们分成若干部分复制到不同的区域,要么调用read()若干次分批将它们读至不同区域。同样,如果想将程序中不同区域的数据块连续地写至文件,也必须进行类似的处理。UNIX提供了另外两个函数—readv()writev(),它们只需一次系统调用就可以实现在文件和进程的多个缓冲区之间传送数据,免除了多次系统调用或复制数据的开销。readv()称为散布读,即将文件中若干连续的数据块读入内存分散的缓冲区中。writev()称为聚集写,即收集内存中分散的若干缓冲区中的数据写至文件的连续区域中。

libaio:Linux异步读写IO(Linuxnative asynchronous I/O)

 posixaio: glibc POSIX 异步IO读写,使用aio_read(3)and aio_write(3)实现IO读写。

mmap: File is memory mappedwith mmap(2) and data copied using memcpy(3).

splice: splice(2) isused to transfer the data and vmsplice(2) to transfer data from user-space tothe kernel.

syslet-rw: Use thesyslet system calls to make regular read/write asynchronous.

sg:SCSI genericsg v3 I/O.

net : Transferover the network. filename must be set appropriately to `host/port’ regardlessof data direction. If receiving,only the port argument is used.

netsplice: Like net,but uses splice(2) and vmsplice(2) to map data and send/receive.

Guasi : The GUASI I/Oengine is the Generic Userspace Asynchronous Syscall Interface approach toasycnronous I/O.

 

2.2.3      direct

当前测试是否采用直接IO方式进行读写,如果采用直接IO,则取值-direct=1,否则取值-direct=0。

采用直接IO写测试,会使得测试结果更加真实。

 

2.2.4      rw

读写模式。

read:顺序读测试,使用方式-rw=read

write:顺序写测试,使用方式-rw=write

randread:随机读测试,使用方式-rw=randread

randwrite:随机写测试,使用方式-rw=randwrite

randrw:随机读写,-rw=randrw;默认比率为5:5,通过参数-rwmixread设定读的比率,如-rw=randrw-rwmixread=70,说明读写比率为70:30。或rwmixwrite

 

 

2.2.5      bs

单次IO的大小;例:-bs=4k

 

2.2.6      bssplit

设备读写访问的IO大小,例:-bssplit=4k/30:8k/40:16k/30,随机读4k文件占30%、8k占40%、16k占30%

 

2.2.7      bsrange

设置IO大小的范围,例如-bsrange=512-2048

 

 

2.2.8      size

本次测试文件的大小;例-size=1G

 

2.2.9      iodepth

IO队列深入,即一次下发的IO的个数,例如:-iodepth=16

 

2.2.10   numjobs

测试进程的并发数,默认为,例:-numjobs=16

 

2.2.11   sync

设置同步模式,同步-sync=1,异步-sync=0

 

2.2.12   fsync

设置数据同步模式,同步-fsync=1,异步-fsync=0

 

2.2.13   runtime

设置测试运行的时间,单位秒,例:-runtime=300

 

2.2.14   group_reporting

关于显示结果的,汇总每个进程的信息

 

2.2.15   lockmem

对测试所使用的内存进行限制,如-lockmem=1g,限制1G

 

……

 

 

3  测试结果解析

测试命令:

[root@node0 fio-2.14]#  fio -filename=/work/fstest/fio.img  -direct=1 -rw=randread -bs=8k -size=1G-numjobs=16 -runtime=60 -group_reporting -name=fio_test
测试中显示:

fio_test: (g=0): rw=randread,bs=8K-8K/8K-8K/8K-8K, ioengine=psync, iodepth=1
...
fio-2.14
Starting 16 processes
Jobs: 16 (f=16): [r(16)] [18.0% done][1840KB/0KB/0KB /s] [230/0/0 iops] [eta 00m:50s]

第一行:当前测试为随机读(randread),IO块大小,文件读写方式psync,IO队列深度为1,

第二行:fio的版本号

第三行:说明任务的并发数

第四行:任务并发数,进度,剩余测试时间。

 

全局测试结果:

[root@node0 fio-2.14]#  fio -filename=/work/fstest/fio.img  -direct=1 -rw=randread -bs=8k -size=1G-numjobs=16 -runtime=60 -group_reporting -name=fio_test
fio_test: (g=0): rw=randread,bs=8K-8K/8K-8K/8K-8K, ioengine=psync, iodepth=1
...
fio-2.14
Starting 16 processes
Jobs: 16 (f=16): [r(16)] [100.0% done][1736KB/0KB/0KB /s] [217/0/0 iops] [eta 00m:00s]
fio_test: (groupid=0, jobs=16): err= 0:pid=9593: Wed May  3 16:34:57 2017
  read : io=107456KB, bw=1787.4KB/s, iops=223,runt= 60119msec
    clat(usec): min=278, max=1975.8K, avg=71518.99, stdev=122792.43
     lat(usec): min=279, max=1975.8K, avg=71519.76, stdev=122792.43
    clatpercentiles (msec):
    |  1.00th=[    7], 5.00th=[    9], 10.00th=[   11], 20.00th=[   15],
     |30.00th=[   19], 40.00th=[   25], 50.00th=[   34], 60.00th=[   45],
     |70.00th=[   62], 80.00th=[   89], 90.00th=[  153], 95.00th=[  269],
     |99.00th=[  652], 99.50th=[  807], 99.90th=[ 1205], 99.95th=[ 1369],
     |99.99th=[ 1860]
    lat(usec) : 500=0.06%, 750=0.01%
    lat(msec) : 4=0.01%, 10=9.47%, 20=24.16%, 50=30.04%, 100=19.14%
    lat(msec) : 250=11.69%, 500=3.47%, 750=1.24%, 1000=0.48%, 2000=0.22%
 cpu          : usr=0.00%,sys=0.25%, ctx=13462, majf=0, minf=563
  IOdepths    : 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=13432/w=0/d=0,short=r=0/w=0/d=0, drop=r=0/w=0/d=0
    latency   : target=0, window=0,percentile=100.00%, depth=1
 
Run status group 0 (all jobs):
   READ:io=107456KB, aggrb=1787KB/s, minb=1787KB/s, maxb=1787KB/s, mint=60119msec,maxt=60119msec
 
Disk stats (read/write):
  sdc:ios=13397/0, merge=0/0, ticks=952825/0, in_queue=956923, util=99.88%


上述结果,说明了读IO的数据量,带宽,IOPS

 

你可能感兴趣的:(数据存储)