介绍
fio 功能强大的性能测试工具, 具备多线程、报告清晰、多种引擎。
没有任何基础的,建议看完fio介绍!后继续阅读。
接下来,以ubuntu为例展示安装和使用过程。
准备条件
安装
-
安装libaio
将下载好的libaio,deb包赋予执行权限;
执行dpkg -i libaio-xxx.deb
就好了
然后开始安装fio -
安装fio
将下载好的fio包解压;或者…
wget https://github.com/axboe/fio/archive/fio-2.1.10.tar.gz
./configure && make -j 100 && make install
完成后执行fio
会看到类似以下界面就说明安装好了。
使用
使用方法很多、大家直接搜下看细节。
以下做一些常用功能的简单介绍。
- 常用功能
100%随机读:
./fio -filename=/opt/testio -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=8k -size=10G -numjobs=50 -runtime=60 -group_reporting -name=rand_100read_8k
100%随机写:
./fio -filename=/opt/testio -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=8k -size=10G -numjobs=50 -runtime=60 -group_reporting -name=rand_100write_8k
100%顺序读:
./fio -filename=/opt/testio -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=8k -size=10G -numjobs=50 -runtime=60 -group_reporting -name=seq_100read_8k
100%顺序写:
./fio -filename=/opt/testio -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=8k -size=10G -numjobs=50 -runtime=60 -group_reporting -name=seq_100write_8k
- 按比例随机读写测试
fio --name=text --ioengine=libaio --bs=4k --direct=1 --thread --norandommap --filename=/home/test.bin --rw=randrw --rwmixread=75 --iodepth=1 --numjobs=1 --size=50G --runtime=3000
参考
fio 参数介绍:
这一部分很长,就放最后了,建议选择性查阅。
常用参数 含义
name 任务的名称
description 对任务内容的描述,等同于注释,job文件中注释使用“;”或者“#”
directory 目录名称,用于存储文件
filename FIO制作文件通常是根据任务名称、线程数量以及文件数量决定。如果想在一个或多个任务中共享文件,应该为每个任务都定于某个文件,这样能覆盖自行产生的文件。多个文件名称可以通过“:”隔开,如果一个任务产生两个工作文件如/dev/sda和/dev/sdb,则filename参数可以设置为filename=/dev/sda:/dev/sdb
nrfiles 某个任务的文件数量,默认值是1。如果定义某个任务的文件大小为1K,且nrfiles等于5的话,则该任务产生5个200字节的文件。
size 这个job IO总共要传输的数据的大小。FIO将会执行到所有的数据传输完成,除非设定了运行时间(‘runtime’选项)。除非有特定的‘nrfiles’选项和‘filesize’选项被设置,fio将会在job定义的文件中平分这个大小。如果这个值不设置的话,fio将会使用这个文件或设备的总大小。如果这些文件不存在的话,size选项一定要给出。也可以给出一个1到100的百分比。e.g. size=20%,fio将会使用给定的文件或设备的20%的空间。
filesize 单个文件的大小,其值可以是一个范围。
ioengine sync 基本的read,write.lseek用来作定位
psync 基本的pread,pwrite
vsync 基本的readv,writev
libaio Linux专有的异步IO。Linux仅支持非buffered IO的队列行为。 性能更好,更节省CPU
posixaio glibc posix异步IO
solarisaio solaris独有的异步IO
windowsaio windows独有的异步IO
mmap 文件通过内存映射到用户空间,使用memcpy写入和读出数据
splice 使用splice和vmsplice在用户空间和内核之间传输数据
syslet-rw 使用syslet 系统调用来构造普通的read/write异步IO
sg SCSI generic sg v3 io.可以是使用SG_IO ioctl来同步,或是目标是一个sg字符设备,我们使用read和write执行异步IO
null 不传输任何数据,只是伪装成这样。主要用于训练使用fio,或是基本debug/test的目的。
net 根据给定的host:port通过网络传输数据。根据具体的协议,hostname,port,listen,filename这些选项将被用来说明建立哪种连接,协议选项将决定哪种协议被使用。
netsplice 像net,但是使用splic/vmsplice来映射数据和发送/接收数据。
cpuio 不传输任何的数据,但是要根据cpuload=和cpucycle=选项占用CPU周期.e.g. cpuload=85将使用job不做任何的实际IO,但要占用85%的CPU周期。在SMP机器上,使用numjobs=<no_of_cpu>来获取需要的CPU,因为cpuload仅会载入单个CPU,然后占用需要的比例。
guasi GUASI IO引擎是一般的用于异步IO的用户空间异步系统调用接口
rdma RDMA I/O引擎支持RDMA内存语义(RDMA_WRITE/RDMA_READ)和通道主义(Send/Recv)用于InfiniBand,RoCE和iWARP协议
external 指明要调用一个外部的IO引擎(二进制文件)。e.g. ioengine=external:/tmp/foo.o将载入/tmp下的foo.o这个IO引擎
bs 单次IO的block size,默认为4k。如果是单个值的话,将会对读写都生效。如果是一个逗号,再跟一个int值的话,则是仅对于写有效。也就是说,格式可以是bs=read_end_write或是bs=read,write。e.g. bs=4k,8k读使用4k的块,写使用8k的块。e.g.bs=,8k将使得写采用8k的块,读采用默认的值。
rw "支持顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、顺序混合读写(readwrite)or(rw)以及随机混合读写(randrw)。
混合读写时的比例为1:1,读写倒换时间是0.5秒。"
FIO也可以设置offset偏移量,例如在rw=randread:8k 但是然并卵
rwmixread 混合读写时,读所占的比例。默认50,需要与rw=randrw 或者 rw=rw 同时使用
rwmixwrite 混合读写时,写所占的比例。默认50,需要与rw=randrw 或者 rw=rw 同时使用
iodepth 设置io engine是异步方式,队列的深度;当其他条件相同是,异步的深度大的任务相对可以获得更好的带宽、IOPS以及IO延时。
numjobs 创建多个相同的任务。通常用来创建大量的进程或者线程做同一件事情,将这样一系列的job,看作一个特定的group
norandommap 正常情况下,fio在进行随机IO测试的时候会覆盖文件的每一个io块。如果设置norandommap参数的话,则fio不会根据以往的io操作而直接得到一个新的随机偏移量。即某些块可能没有被读取,某些块可能读取过多次。
direct true,则标明采用non-buffered io.同O_DIRECT效果一样。ZFS和Solaris不支持direct io,在windows同步IO引擎不支持direct io
runtime 告诉fio多少秒后终止处理。很难判定某个任务会执行多长时间,所以这个参数可以方便的将总共运行的时间设置成指定时间。
ramp_time 设置测试预热时间
time_based 与runtime参数搭配使用,使得测试执行时间以runtime优先级最高
startdelay 延迟启动FIO测试,默认单位是秒.(配合job文件测试时使用)只有在job文件包含几个jobs时才有效,是为了将某个job延时几秒后执行。
group_reporting 与numjobs参数搭配使用,测试完成后输出所有线程/进程的测试结果之和
rate "限制job的带宽。
e.g.rate=500k,限制读和写到500k/s
e.g.rate=1m,500k,限制读到1MB/s,限制写到500KB/s
e.g.rate=,500k , 限制写到500kb/s
e.g.rate=500k, 限制读到500KB/s"
ratemin 告诉fio尽最大能力来保证这个最小的带宽,如果不能满足这个需要,将会导致程序退出。
rate_iops 将带宽限制到固定数目的IOPS,基本上同rate一样,只是独立于带宽,如果job是指定了一个block size范围,而不是一个固定的值的话,最小blocksize将会作为标准。
rate_iops_min 如果fio进行io操作的是,没有达到要求的最小级别的IOPS,任务退出;
prio 设置job的优先级,linux将这个值限制在0-7之间,0是最高的。
thinktime 上一个IO完成之后,拖延x毫秒,然后跳到下一个。可以用来访真应用进行的处理。
thinktime_spin 只有在thinktime设置时才有效,在为了sleep完thinktime规定的时间之前,假装花费CPU时间来做一些与数据接收有关的事情。
thinktime_blocks 只有在thinktime设置时才有效,控制在等等‘thinktime’的时间内产生多少个block,如果没有设置的话,这个值将是1,每次block后,都会将等待‘thinktime’us
blockalign=int,ba=int 配置随机io的对齐边界。默认是与blocksize的配置一致,对于direct_io,最小为512b,因为它与依赖的硬件块大小,对于使用文件的随机map来说,这个选项不起作用。
blocksize_range=irange,bsrange=irange 不再采用单一的块大小,而是定义一个范围,fio将采用混合io块大小.IO单元大小一般是给定最小值的备数。同时应用于读写,当然也可以通过‘,’来隔开分别配置读写。
sync
thread 默认fio使用fork函数创建任务,但是如果thread参数设置了后,fio会使用pthread_create创建线程。
write_iolog 将执行的io模式记录到指定的文件中
read_iolog 打开一个iolog文件,然后按照该文件中包含的io模式重复进行测试
write_bw_log 记录任务的带宽,用于存储在任务生命周期内的带宽数据。fio_generate_plots 脚本使用gunplot将这些文件文件转换成图形。
write_lat_log 存储io完成的延时
lockmem 占用内存,模拟只有少量内存。
cpumask 设置当前的工作和某个CPU相关联。设置job使用的CPU.给出的参数是一个掩码来设置job可以运行的CPU。所以,如果要允许CPU在1和5上的话,可以通过10进制数来设置(1<<1 | 1<<5),或是34。查看sched_setaffinity的man page。它可能并不是支持所有的操作系统和kernel版本。This option doesn’t work well for a higher CPU count than what you can store in an integer mask, so it can only control cpus 1-32. For boxes with larger CPU counts, use cpus_allowed
cpus_allowed 功能同cpumask一样,但是允许通过一段文本来设置允许的CPU。e.g.上面的例子可是这样写cpus_allowed=1,5。这个选项允许设置一个CPU范围,如cpus_allowed=1,5,8-15
cpuload 如果任务是属于CPU 负载测试,则设置CPU的占用率达到某个值。
cpuchunks 设置某段时间内cpu的占用率为某个值。单位为毫秒。
iodepth_batch 每次提交的io数量,默认是iodepth,但是可以设置小于iodepth,甚至设置为1也行。
iodepth_low 如果iodepth_low设置了,则当iodepth填充队列后,下次以iodepth_low大小
填充队列。
randrepeat 对于随机IO压力测试,使得ioengine以可预见的方式执行,这样测试结果是可重复的。其值为0或者为1
buffered 如果direct设置为真,则使用缓冲io方式,否则使用非缓冲方式。
rwmixcycle 混合读写切换的时间为每500毫秒切换一次。即0.5秒
unlink 将任务文件unlink,默认为假。当重复执行某个任务的时候,使用unlink节约重复创建文件而浪费的时间。
loops 重复执行该任务的次数,默认为1。可以让某个任务重复执行多次,则可设置该参数
verify 写入文件的时候,fio可以验证文件内容。支持md5、crc校验
prioclass 设置优先级等级。
nice 根据给定的nice值来运行这个job
overwrite 如果是true的话,写一个文件的话,将会覆盖已经存在的数据。如果文件不存在的话,它将会在写阶段开始的时候创建这个文件。
invalidate Invalidate the buffer/page cache parts for this file prior to starting io. Defaults to true.