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. 下载源码
官网或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
fio -filename=<测试文件或块设备> -ioengine=sync -direct=1 -rw=randread -bs=8k -size=1G -numjobs=8 -runtime=10-group_reporting -name=fio_test
待测试的文件或块设备。
若为文件,则代表测试文件系统的性能;例:-filename=/work/fstest/fio.img
若为块设备,则代表测试裸设备的性能; 例:-filename=/dev/sdb1
采用的文件读写方式
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.
当前测试是否采用直接IO方式进行读写,如果采用直接IO,则取值-direct=1,否则取值-direct=0。
采用直接IO写测试,会使得测试结果更加真实。
读写模式。
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
单次IO的大小;例:-bs=4k
设备读写访问的IO大小,例:-bssplit=4k/30:8k/40:16k/30,随机读4k文件占30%、8k占40%、16k占30%
设置IO大小的范围,例如-bsrange=512-2048
本次测试文件的大小;例-size=1G
IO队列深入,即一次下发的IO的个数,例如:-iodepth=16
测试进程的并发数,默认为,例:-numjobs=16
设置同步模式,同步-sync=1,异步-sync=0
设置数据同步模式,同步-fsync=1,异步-fsync=0
设置测试运行的时间,单位秒,例:-runtime=300
关于显示结果的,汇总每个进程的信息
对测试所使用的内存进行限制,如-lockmem=1g,限制1G
……
测试命令:
[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