常用参数

-filename=/dev/sdb		#要测试盘的名称,支持文件系统或者裸设备,/dev/sda2或/dev/sdb
-direct=1		 #测试过程绕过机器自带的buffer,使测试结果更真实(Linux在读写时,数据会先写到缓存,再在后台写到硬盘,读的时候也是优先从缓存中读,这样访问速度会加快,但是一旦掉电,缓存中数据就会清空,所有一种模式为DirectIO,可以跳过缓存,直接读写硬盘)
-ioengine=libaio		#定义使用什么io引擎去下发io请求,常用的一些 libaio:Linux本地异步I/O;rbd:通过librbd直接访问CEPH Rados 
-iodepth=16		 #队列的深度为16,在异步模式下,CPU不能一直无限的发命令到硬盘设备。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。
-bs=4k #单次io的块文件大小为4k
-numjobs=10 #本次测试的线程数是10
-size=5G #每个线程读写的数据量是5GB
-runtime=60 #测试时间为60秒,可以设置2m为两分钟。如果不配置此项,会将设置的size大小全部写入或者读取完为止
-rw=randread #测试随机读的I/O
-rw=randwrite #测试随机写的I/O
-rw=randrw #测试随机混合写和读的I/O
-rw=read #测试顺序读的I/O
-rw=write #测试顺序写的I/O
-rw=rw #测试顺序混合写和读的I/O
-thread #使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试
-rwmixwrite=30 #在混合读写的模式下,写占30%(即rwmixread读为70%,单独配置这样的一个参数即可)
-group_reporting #关于显示结果的,汇总每个进程的信息
-name="TDSQL_4KB_read_test" #定义测试任务名称
扩展
-lockmem=1g #只使用1g内存进行测试
-zero_buffers #用全0初始化缓冲区,默认是用随机数据填充缓冲区
-random_distribution=random #默认情况下,fio 会在询问时使用完全均匀的随机分布,有需要的话可以自定义访问区域,zipf、pareto、normal、zoned
-nrfiles=8 #每个进程生成文件的数量

报告分析

下面是每个执行的数据方向的I/O统计数据信息的代表值含义

read/write: 读/写的IO操作(还有一个trim没用过)
salt: 提交延迟,这是提交I/O所花费的时间(min:最小值,max:最大值,avg:平均值,stdev:标准偏差)
chat: 完成延迟,表示从提交到完成I/O部分的时间
lat: 相应时间,表示从fio创建I/O单元到完成I/O操作的时间
bw: 带宽统计
iops: IOPS统计
lat(nsec/usec/msec): I/O完成延迟的分布。这是从I/O离开fio到它完成的时间。与上面单独的读/写/修剪部分不同,这里和其余部分的数据适用于报告组的所有I/ o。10=0.01%意味着0.01%的I/O在250us以下完成。250=0.02%意味着0.02%的I/O需要10到250us才能完成。
cpu: cpu使用率
IO depths: I/O深度在作业生命周期中的分布
IO submit: 在一个提交调用中提交了多少个I/O。每一个分录表示该数额及其以下,直到上一分录为止——例如,4=100%意味着我们每次提交0到4个I/O调用
IO complete: 和上边的submit一样,不过这个是完成了多少个
IO issued rwt: 发出的read/write/trim请求的数量,以及其中有多少请求被缩短或删除
IO latency: 满足指定延迟目标所需的I/O深度

下面是Run status group 0 (all jobs) 全部任务汇总信息的代表值含义:

bw: 总带宽以及最小和最大带宽
io: 该组中所有线程执行的累计I/O
run: 这组线程中最小和最长的运行时

最后是Linux中特有的磁盘状态统计信息的代表值含义:

ios: 所有组的I/ o个数
merge: I/O调度器执行的总合并数
ticks: 使磁盘繁忙的滴答数(仅供参考,原文是Number of ticks we kept the disk busy)
in_queue: 在磁盘队列中花费的总时间
util: 磁盘利用率。值为100%意味着我们保留了磁盘,如果一直很忙,那么50%的时间磁盘就会闲置一半的时间

测试用例

# 顺序读
fio --name=big-file-multi-read --directory=/tmp -direct=1 --rw=read --bs=4M --size=2G --numjobs=2
# 顺序写
fio --name=big-file-multi-write --directory=/tmp -direct=1 --rw=write --bs=4M --size=2G --numjobs=2
# 随机读
fio --name=big-file-multi-randread --directory=/tmp -direct=1 --rw=randread --bs=4M --size=2G --numjobs=2
# 随机写
fio --name=big-file-multi-randwrite --directory=/tmp -direct=1 --rw=randwrite --bs=4M --size=2G --numjobs=2