fio——IO基准测试

简介

fio是IO工具,既可以用于基准测试,也可以用于硬件的压力测试验证(stress/hardware verification)。

支持13种不同的IO引擎(sync、mmap、libaio、posixaio、SG v3、splice、null、network、syslet、guasi、solarisaio或者更多),IO优先级(支持更新的Linux内核),rate IO,forked or 线程任务等。既适用于块设备,也适用于文件。fio可以解析job描述,这些描述来自于简单可理解的文本格式文件。

fio可以展示多种io性能信息,包括IO延迟(IO latencies),IO百分率(IO percentiles)。FIO有广泛的应用,例如基准测试、质量测试(QA)、测试验证等。支持Linux、FreeBSD、NetBSD、OS X、Open Solaris、AIX、HPUX以及Windows等操作系统。

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, including complete IO latencies and percentiles. 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.

http://freecode.com/projects/fio

特点

这个工具最大的特点是使用简单,支持的文件操作非常多, 可以覆盖到我们能见到的文件使用方式:
sync:Basic read(2) or write(2) I/O. fseek(2) is used to position the I/O location.
psync:Basic pread(2) or pwrite(2) I/O.
vsync: Basic readv(2) or writev(2) I/O. Will emulate queuing by coalescing adjacents IOs into a single submission.
libaio: Linux native asynchronous I/O.
posixaio: glibc POSIX asynchronous I/O using aio_read(3) and aio_write(3).
mmap: File is memory mapped with mmap(2) and data copied using memcpy(3).
splice: splice(2) is used to transfer the data and vmsplice(2) to transfer data from user-space to the kernel.
syslet-rw: Use the syslet system calls to make regular read/write asynchronous.
sg:SCSI generic sg v3 I/O.
net : Transfer over the network. filename must be set appropriately to `host/port’ regardless of 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/O engine is the Generic Userspace Asynchronous Syscall Interface approach to asycnronous I/O.

还可以控制io depth对于测试磁盘的性能很有帮助,对结果的解读也做的很明白。

http://blog.yufeng.info/archives/677

帮助

fio-2.1.2
fio [options] [job options] <job file(s)>
  --debug=options       Enable debug logging. May be one/more of:
                        process,file,io,mem,blktrace,verify,random,parse,
                        diskutil,job,mutex,profile,time,net
  --parse-only          Parse options only, don't start any IO
  --output              Write output to file
  --runtime             Runtime in seconds
  --latency-log         Generate per-job latency logs
  --bandwidth-log       Generate per-job bandwidth logs
  --minimal             Minimal (terse) output
  --output-format=x     Output format (terse,json,normal)
  --terse-version=x     Set terse version output format to 'x'
  --version             Print version info and exit
  --help                Print this page
  --cpuclock-test       Perform test/validation of CPU clock
  --cmdhelp=cmd         Print command help, "all" for all of them
  --enghelp=engine      Print ioengine help, or list available ioengines
  --enghelp=engine,cmd  Print help for an ioengine cmd
  --showcmd             Turn a job file into command line options
  --eta=when            When ETA estimate should be printed
                        May be "always", "never" or "auto"
  --eta-newline=time    Force a new line for every 'time' period passed
  --status-interval=t   Force full status dump every 't' period passed
  --readonly            Turn on safety read-only checks, preventing writes
  --section=name        Only run specified section in job file
  --alloc-size=kb       Set smalloc pool to this size in kb (def 1024)
  --warnings-fatal      Fio parser warnings are fatal
  --max-jobs=nr         Maximum number of threads/processes to support
  --server=args         Start a backend fio server
  --daemonize=pidfile   Background fio server, write pid to file
  --client=hostname     Talk to remote backend fio server at hostname
  --idle-prof=option    Report cpu idleness on a system or percpu basis
                        (option=system,percpu) or run unit work
                        calibration only (option=calibrate)

例子

[root@localhost data1]# fio --filename=/dev/sda6 --direct=1 --rw=randread --bs=4k --size=60G --numjobs=64 --runtime=10 --group_reporting --name=file2  
file2: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
...
file2: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.2
Starting 64 processes
Jobs: 64 (f=64): [rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr] [100.0% done] [33816KB/0KB/0KB /s] [8454/0/0 iops] [eta 00m:00s]
file2: (groupid=0, jobs=64): err= 0: pid=5176: Mon Nov 11 11:19:07 2013
  read : io=332596KB, bw=33134KB/s, iops=8283, runt= 10038msec
    clat (usec): min=61, max=214260, avg=7689.06, stdev=10823.87
     lat (usec): min=61, max=214260, avg=7689.46, stdev=10823.87
    clat percentiles (usec):
     |  1.00th=[  229],  5.00th=[  247], 10.00th=[  262], 20.00th=[  334],
     | 30.00th=[ 1672], 40.00th=[ 2928], 50.00th=[ 4256], 60.00th=[ 5664],
     | 70.00th=[ 8160], 80.00th=[11840], 90.00th=[19328], 95.00th=[28032],
     | 99.00th=[51968], 99.50th=[63744], 99.90th=[89600], 99.95th=[103936],
     | 99.99th=[148480]
    bw (KB  /s): min=  231, max= 1061, per=1.55%, avg=513.75, stdev=98.50
    lat (usec) : 100=0.19%, 250=5.80%, 500=19.22%, 750=1.58%, 1000=0.82%
    lat (msec) : 2=4.63%, 4=16.07%, 10=27.74%, 20=14.44%, 50=8.40%
    lat (msec) : 100=1.05%, 250=0.06%
  cpu          : usr=0.11%, sys=0.35%, ctx=83444, majf=0, minf=2203
  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=83149/w=0/d=0, short=r=0/w=0/d=0

Run status group 0 (all jobs):
   READ: io=332596KB, aggrb=33133KB/s, minb=33133KB/s, maxb=33133KB/s, mint=10038msec, maxt=10038msec

Disk stats (read/write):
  sda: ios=82814/13, merge=0/6, ticks=636982/30, in_queue=636949, util=98.87%
--filename

(待续)

原文地址:https://www.cnblogs.com/gsblog/p/3417922.html