FIO使⽤说明(最详细最全的参数说明)
这个⽂档是对fio-2.0.9 HOWTO⽂档的翻译,fio的参数太多了,翻译这个⽂档时并没有每⼀个参数的功能和使⽤⽅法,只有少量参数做了试验,⼤部分的参数采⽤的是根据字⾯翻译或是个⼈理解的翻译,必然有些出⼊,先发出来,以后有使⽤的时候再被充和修改。在另⼀个⽂档中会对fio⾃带的实例进⾏分析,可能会更为清晰⼀些。
fio这个⼯具实在太强⼤了,列举⼀下他的NB之处吧
1)⽀持⼗⼏种存储引擎,可以⾃定义
2)⾃带做图⼯具,调⽤gnuplot做图
3)⽀持⼏乎所有的存储描述参数
4)⼤量对CPU,内存,进程/线程,⽂件,IO特性的配置
5)压缩,trace回放,。。。这些都包含,灵活的配置
简介
fio最初是⽤来节省为特定负载写专门测试程序,或是进⾏性能测试,或是到和重现bug的时间。写这么⼀个测试应⽤是⾮常浪费时间的。因此需要⼀个⼯具来模拟给定的io负载,⽽不⽤重复的写⼀个⼜⼀个的特定的测试程序。但是test负载很难定义。因为可能会产⽣很多进程或线程,他们每⼀个都⽤他们⾃⼰的⽅式产⽣io。fio需要⾜够灵活得来模拟这些case。
典型的fio的⼯作过程
1)写⼀个job⽂件来描述要访真的io负载。⼀个job⽂件可以控制产⽣任意数⽬的线程和⽂件。典型的job⽂件有⼀个global段(定义共享参数),⼀个或多少job段(描述具体要产⽣的job)。
2)运⾏时,fio从⽂件读这些参数,做处理,并根据这些参数描述,启动这些访真线程/进程
运⾏fio
运⾏⽅式:
$fio job_file
它会根据job_file的内容来运⾏。你可以在命令⾏中指定多个job file,fio进串⾏化运⾏这些⽂件。相当于在同⼀个job file不同的section之间使⽤了stonewall参数。
如果某个job file只包含⼀个job,可以在命令⾏中给出参数,来直接运⾏,不再需要读取job file。命令⾏参数同job file参数的格式是⼀样的。⽐如,在job file中的参数iodepth=2,在命令⾏中可以写为–iodepth 2 或是 –iodepth=2.
fio不需要使⽤root来⽀⾏,除⾮使⽤到的⽂件或是设备需要root权限。⼀些选项可能会被限制,⽐如内存锁,io调度器切换,或是
nice value降级。
job⽂件格式
job file格式采⽤经典的ini⽂件,[]中的值表⽰job name,可以采⽤任意的ASCII字符,‘global’除外,global有特殊的意义。
Global section描述了job file中各个job的默认配置值。⼀个job section可以覆盖global section中的参数,⼀个job file可以包含⼏个global section.⼀个job只会受到它上⾯的global section的影响。‘;’和‘#’可以⽤作注释
两个进程,分别从⼀个从128MB⽂件中,随机读的job file.random翻译
;–start job file–
[global]
rw=randread
size=128m
[job1]
[job2]
;–end job file–
job1和job2 section是空的,因为所有的描述参数是共享的。没有给出filename=选项,fio会为每⼀个job创建⼀个⽂件名,如果⽤命令写,则是:
$fio –name=global –rw=randread –size=128m –name=job1 –name=job2
多个进程随机写⽂件的实例
;–start job file –
[random-writers]
ioengine=libaio
iodepth=4
rw=randwrite
bs=32k
direct=0
size=64m
numjobs=4
;–end job file–
没有global section,只有⼀个job section.
上⼀个实例的说明:采⽤async,每⼀个⽂件的队列长度为4,采⽤随机写,采⽤32k的块,采⽤⾮direct io,共有4个进程,每个进程随机写64M的⽂件。也可以采⽤下⾯的命令
$fio –name=random-writers –ioengine=libaio –iodepth=4 –rw=randwrite –bs=32k –direct=0 –size=64m –numjobs=4
环境变量
在job file中⽀持环境变量扩展。类似于${VARNAME}可以作为选项的值(在=号右边)。
实例:
$SIZE=64m  NUMJOBS=4 fio jobfile,fio
;–start job files–
[random-writers]
rw=randwrite
size=${SIZE}
numjobs=${NUMJOBS}
;–end job file–
将被扩展为
;–start job file–
[random-writers]
rw=randwrite
size=64m
numjobs=4
;–end job file–
保留keywords
fio有⼀些保留keywords,在内部将其替换成合适的值,这些keywords是:
$pagesize  当前系统的页⼤⼩
$mb_memory 系统的总内存的⼤⼩,以MB为单位
$ncpus 在线有效的cpu数
这引起在命令⾏中和job file中都可以⽤,当job运⾏的时候,会⾃动的⽤当前系统的徝进⾏替换。⽀持简单的数学计算,如:size=8*$mb_memory
类型
str 字符串
time时间(int)
int 整数
bool
irange 整数范围
float_list 符点数列
⼀个job包含的基本的参数
1)IO类型
向⽂件发起的IO类型。
<1>readwrite=str,rw=str
read 顺序读
write 顺序写
randwrite 随机写
randread 随机读
rw,readwrite 顺序混合读写
randrw 随机混合读写
[参数备注]
对于混合io类型,混认是50%的读,50%的写,对于特定的io类型,因为速度可能不同,结果可能会有稍有偏差.
通过在在str之后加“:<nr>”可以配置在执⾏⼀下获取offset操作之前要执⾏的IO次数。
For a random read, it would lik ’rw=randread:8′ for passing in an offset modifier with a value of 8.如果后缀⽤于顺序IO类型的话,,那么将在每次IO之后,将这个值加到产⽣的offset之后。e.g. rw=write:4k每次写之后将会跳过4K。它将顺序的IO转化为带有洞的顺序IO。参考‘rw_sequencer’选项。
<2>rw_sequencer=str
如果rw=<str>后有offset修饰的话,这个选项可以控制这个数字<nr>如何修饰产⽣的IO offset.可以接收的值是:
sequential 产⽣顺序的offset
identical 产⽣相同的offset
[参数备注]
‘sequential’仅⽤于随机IO。通常情况下,fio在每次IO之后,将会⽣成⼀个新的随机IO。e.g.rw=randread:8,将会在每8次IO之后执⾏seek,⽽不是每次IO之后。顺序IO已经是顺序的,再设置为‘sequential’将不会产⽣任何不同。‘identical’会产⽣
同‘sequential’相似的⾏为,只是它会连续产⽣8次相同的offset,然后⽣成⼀个新的offset.
2)block size
产⽣的IO单元的⼤⼩,可以是⼀个孤⽴的值,也可以是⼀个范围。
<1>blocksize=int,bs=int
单次IO的block size,默认为4k。如果是单个值的话,将会对读写都⽣效。如果是⼀个逗号,再跟⼀个int值的话,则是仅对于写有效。也就是说,格式可以是bs=read_end_write或是bs=read,write。e.g. bs=4k,8k读使⽤4k的块,写使⽤8k的块。e.g.bs=,8k将使得写采⽤8k 的块,读采⽤默认的值。
3)IO size
将会读/写多少数据
<1>size=int
这个job IO总共要传输的数据的⼤⼩。FIO将会执⾏到所有的数据传输完成,除⾮设定了运⾏时间(‘runtime’选项)。除⾮有特定
的‘nrfiles’选项和‘filesize’选项被设置,fio将会在job定义的⽂件中平分这个⼤⼩。如果这个值不设置的
话,fio将会使⽤这个⽂件或设备的总⼤⼩。如果这些⽂件不存在的话,size选项⼀定要给出。也可以给出⼀个1到100的百分⽐。e.g. size=20%,fio将会使⽤给定的⽂件或设备的20%的空间。
4)IO引擎
发起IO的⽅式。
<1>ioengine=str
定义job向⽂件发起IO的⽅式
sync 基本的read,write.lseek⽤来作定位
psync 基本的pread,pwrite
vsync 基本的readv,writev
libaio 专有的异步IO。仅⽀持⾮buffered IO的队列⾏为。
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引擎
5)IO depth
如果IO引擎是异步的,这个指定我们需要保持的队列深度
<1>iodepth=int
加于⽂件之上的保持的IO单元。默认对于每个⽂件来说是1,可以设置⼀个更⼤的值来提供并发度。iodepth⼤于1不会影响同步IO引擎(除⾮verify_async这个选项被设置)。
even async engines may impose OS restrictions causing the desired depth not to be achieved.这会在Linux使⽤libaio并且设置direct=1的时候发⽣,因为buffered io在OS中不是异步的。在外部通过类似于iostat这些⼯具来观察队列深度来保证这个IO队列深度是我们想要的。这个可以参考褚霸的博客blog.yufeng.info/archives/2104
6)IO type
<1>direct=bool
true,则标明采⽤non-buffered io.同O_DIRECT效果⼀样。ZFS和Solaris不⽀持direct io,在windows同步IO引擎不⽀持direct io
<2>buffered=bool
true,则标明采⽤buffered io。是direct的反义词,默认是true
7)Num files
负载将分发到⼏个⽂件之中
<1>nrfiles=int
⽤于这个job的⽂件数⽬,默认为1
<2>openfiles=int
在同⼀时间可以同时打开的⽂件数⽬,默认同nrfiles相等,可以设置⼩⼀些,来限制同时打开的⽂件数⽬。
8)Num threads
<1>numjobs=int

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。