FIO Perf Tool Nutshell

por | 19 diciembre, 2013

FIO is an I/O tool meant to be used both for benchmark and stress/hardware verification. It has support for 13 different types of I/O engines (sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio, and more), I/O priorities (for newer Linux kernels), rate I/O, forked or threaded jobs, and much more. It can work on block devices as well as files. fio accepts job descriptions in a simple-to-understand text format. Several example job files are included. fio displays all sorts of I/O performance information. Fio is in wide use in many places, for both benchmarking, QA, and verification purposes. It supports Linux, FreeBSD, NetBSD, OS X, OpenSolaris, AIX, HP-UX, and Windows.
FIO headquarters and link for source download is located here: http://freecode.com/projects/fio

You may find also precompiled versions for some platforms:
AIX: http://www.perzl.org/aix/index.php?n=Main.Fio
Windows: http://www.bluestop.org/fio/releases/fio-1.57.1.msi
RHEL 5
32-bit: http://pkgs.org/centos-5-rhel-5/rpmforge-i386/fio-1.58-1.el5.rf.i386.rpm.html
64-bit: http://pkgs.org/centos-5-rhel-5/rpmforge-x86_64/fio-1.58-1.el5.rf.x86_64.rpm.html
RHEL 6
32-bit: http://pkgs.org/centos-6-rhel-6/rpmforge-i386/fio-1.58-1.el6.rf.i686.rpm.html
64-bit: http://pkgs.org/centos-6-rhel-6/rpmforge-x86_64/fio-1.58-1.el6.rf.x86_64.rpm.html

Sample command runs (syntax is exactly the same on all platforms):
1. Write out a 20GB file called fio.write.out in 64k chunks, 1 thread:
# fio --size=20g --bs=64k --rw=write --ioengine=sync --name=fio.write.out
2. Read 20GB from file fio.write.out in 64k chunks, 1 thread:
# fio --size=20g --bs=64k --rw=read --ioengine=sync --name=fio.write.out
3. Write out 4 x 10GB files in 64k chunks, 4 threads:
# fio --size=10g --bs=64k --rw=write --ioengine=sync --name=fio.write.out --numjobs=4
4. Read 10GB from files fio.write.out.* in 64k chunks, 4 threads:
# fio --size=10g --bs=64k --rw=read --ioengine=sync --name=fio.write.out --numjobs=4

NOTE: It is recommended to run the write tests first. The read tests will use the files created by the write tests. If you run the read tests first, you will have to wait for fio to create the file it needs first.

Please find below a short howto of how to compile it from source and use it (for the installation of compiled version, please check the manual for your platform). The tests were done on a Debian Lenny machine:

Download:

core:~# cd /usr/src
core:src# wget http://brick.kernel.dk/snaps/fio-2.0.7.tar.gz
--2012-04-18 13:24:03--  http://brick.kernel.dk/snaps/fio-2.0.7.tar.gz
Resolving brick.kernel.dk... 87.104.106.3
Connecting to brick.kernel.dk|87.104.106.3|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 272301 (266K) [application/x-gzip]
Saving to: `fio-2.0.7.tar.gz'

100%[===================================================>] 272,301     1.17M/s   in 0.2s    

2012-04-18 13:24:03 (1.17 MB/s) - `fio-2.0.7.tar.gz' saved [272301/272301]

Uncompress and compile:

core:src# tar xf fio-2.0.7.tar.gz
core:src# cd fio-2.0.7
core:fio-2.0.7# make
    CC gettime.o
    CC fio.o
    CC ioengines.o
    CC init.o
    CC stat.o
    CC log.o
    CC time.o
    CC filesetup.o
    CC eta.o
    CC verify.o
    CC memory.o
    CC io_u.o
    CC parse.o
    CC mutex.o
    CC options.o
    CC rbtree.o
    CC smalloc.o
    CC filehash.o
    CC profile.o
    CC debug.o
    CC lib/rand.o
    CC lib/num2str.o
    CC lib/ieee754.o
    CC crc/crc16.o
    CC crc/crc32.o
    CC crc/crc32c.o
    CC crc/crc32c-intel.o
    CC crc/crc64.o
    CC crc/crc7.o
    CC crc/md5.o
    CC crc/sha1.o
    CC crc/sha256.o
    CC crc/sha512.o
    CC engines/cpu.o
    CC engines/mmap.o
    CC engines/sync.o
    CC engines/null.o
    CC engines/net.o
    CC memalign.o
    CC server.o
    CC client.o
    CC iolog.o
    CC backend.o
    CC libfio.o
    CC flow.o
    CC diskutil.o
    CC fifo.o
    CC blktrace.o
    CC helpers.o
    CC cgroup.o
    CC trim.o
    CC engines/libaio.o
    CC engines/posixaio.o
    CC engines/sg.o
    CC engines/splice.o
    CC engines/syslet-rw.o
    CC engines/guasi.o
    CC engines/binject.o
    CC engines/rdma.o
    CC profiles/tiobench.o
    CC fio

In my situation, I had to install two debian packages, libaio1 and libaio-dev, but maybe for you is not the case:

core:fio-2.0.7# make
    CC gettime.o
In file included from fio.h:24,
                 from gettime.c:10:
os/os.h:45:20: error: libaio.h: No such file or directory
In file included from fio.h:30,
                 from gettime.c:10:
ioengine.h:23: error: field ‘iocb’ has incomplete type
make: *** [gettime.o] Error 1

If everything runs well, you will have now your fio in the same directory:

core:fio-2.0.7# ls -la fio
-rwxr-xr-x 1 root root 2025139 2012-04-18 14:08 fio

And finally, one example of write test:

core:fio-2.0.7# ./fio --size=1g --bs=10m --rw=write --ioengine=sync --name=/tmp/fio.write.out
/tmp/fio.write.out: (g=0): rw=write, bs=10M-10M/10M-10M, ioengine=sync, iodepth=1
fio 2.0.7
Starting 1 process
/tmp/fio.write.out: Laying out IO file(s) (1 file(s) / 1024MB)
Jobs: 1 (f=1): [W] [93.3% done] [0K/72601K /s] [0 /6  iops] [eta 00m:01s]
/tmp/fio.write.out: (groupid=0, jobs=1): err= 0: pid=7329
  write: io=1020.0MB, bw=76340KB/s, iops=7 , runt= 13682msec
    clat (msec): min=6 , max=244 , avg=133.09, stdev=40.49
     lat (msec): min=6 , max=245 , avg=133.98, stdev=40.49
    clat percentiles (msec):
     |  1.00th=[    7],  5.00th=[   94], 10.00th=[  101], 20.00th=[  114],
     | 30.00th=[  117], 40.00th=[  124], 50.00th=[  133], 60.00th=[  137],
     | 70.00th=[  143], 80.00th=[  155], 90.00th=[  180], 95.00th=[  215],
     | 99.00th=[  231], 99.50th=[  245], 99.90th=[  245], 99.95th=[  245],
     | 99.99th=[  245]
    bw (KB/s)  : min=59190, max=146024, per=100.00%, avg=76679.38, stdev=16414.53
    lat (msec) : 10=2.94%, 50=0.98%, 100=5.88%, 250=90.20%
  cpu          : usr=0.12%, sys=8.25%, ctx=2064, majf=0, minf=29
  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=0/w=102/d=0, short=r=0/w=0/d=0

Run status group 0 (all jobs):
  WRITE: io=1020.0MB, aggrb=76339KB/s, minb=76339KB/s, maxb=76339KB/s, mint=13682msec, maxt=13682msec

Disk stats (read/write):
    dm-2: ios=0/231936, merge=0/0, ticks=0/828024584, in_queue=763954112, util=100.00%, aggrios=146/233487, aggrmerge=0/0, aggrticks=0/0, aggrin_queue=0, aggrutil=0.00%
    md1: ios=146/233487, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=138/2352, aggrmerge=1/253904, aggrticks=16746/1041224, aggrin_queue=1095744, aggrutil=100.00%
  sdb: ios=149/2530, merge=2/253718, ticks=13288/165452, in_queue=180028, util=75.24%
  sda: ios=127/2174, merge=1/254091, ticks=20204/1916996, in_queue=2011460, util=100.00%