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.
;–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
创建特定数⽬的job副本。可能是创建⼤量的线程/进程来执⾏同⼀件事。我们将这样⼀系列的job,看作⼀个特定的group
详细参数:
<1>name=str
job名,⽤于输出信息⽤的名字。如果不设置的话,fio输出信息时将采⽤job name,如果设置的话,将⽤设置的名字。在命令⾏中,这个参数有特殊的作⽤,标明⼀个新job的开始。
<2>description=str
job的说明信息,在job运⾏的时候不起作⽤,只是在输出⽂件描述信息的时候才起作⽤。
<3>directory=str
使⽤的⽂件的路径前缀,默认是./
<4>filename=str
⼀般情况下,fio会根据job名,线程号,⽂件名来产⽣⼀个⽂件名。如果,想在多个job之间共享同⼀个⽂件的话,可以设定⼀个名字来代替默认的名字.如果ioengine是‘net’的话,⽂件名则是以这种格式=host,port,protocol.如果ioengine是基于⽂件的话,可以通过‘:’分割来设定⼀系列的⽂件。e.g. filename=/dev/sda:/dev/sdb 希望job打开/dev/sda和/dev/sdb作为两个⼯作⽂件。
<5>opendir=str
让fio递归的添加⽬录下和⼦⽬录下的所有⽂件。
<6>lockfile=str
fio在⽂件上执⾏IO之前默认是不锁⽂件的,这样的话,当有多个线程在此⽂件上执⾏IO的话,会造成结果的不⼀致。这个选项可以⽤来共享⽂件的负载,⽀持的锁类型:
none 默认不使⽤锁
exclusive 排它锁
readwrite 读写锁
在后⾯可以加⼀个数字后缀,如果设置的话,每⼀个线程将会执⾏这个数字指定的IO后才会放弃锁,因为锁的开销是⽐较⼤的,所以这种⽅式可以加速IO。
<7>kb_base=int
size换算单位,1000/1024,默认为1024
<8>randrepeat=bool
对于随机IO负载,配置⽣成器的种⼦,使得路径是可以预估的,使得每次重复执⾏⽣成的序列是⼀样的。
<9>use_os_rand=bool
fio可以使⽤的随机数产⽣器,也可以使⽤fio内部的随机数产⽣器(基于tausworthe),默认是采⽤fio内部的产⽣器,质量更数,速度更快。
<7>fallocate=str
如何准备测试⽂件
none 不执⾏预分配空间
posix 通过posix_fallocate()预分配空间
keep 通过fallocate()(设置FALLOC_FL_KEEP_SIZE)预分配空间
0 none的别名,出于兼容性
1 posix的别名,出于兼容性
并不是在所有的平台上都有效,‘keep’仅在linux上有效,ZFS不⽀持。默认为‘posix’
<8>fadvise_hint=bool
默认fio将使⽤fadvise()来告知内核fio要产⽣的IO类型,如果不想告诉kernel来执⾏⼀些特定的IO类型的话,可⾏关闭这个选项。如果设置的
话,fio将使⽤POSIX_FADV_SEWUENTIAL来作顺序IO,使⽤POSIX_FADV_RANDOM来做随机IO
<9>filesize=int
单个⽂件的⼤⼩,可以是⼀个范围,在这种情况下,fio将会在⼀个范围内选择⼀个⼤⼩来决定单个⽂件⼤⼩,如果没有设置的话,所有的⽂
件将会是同样的⼤⼩。
<10>fill_device=bool,fill_fs=bool
填满空间直到达到终⽌条件ENOSPC,只对顺序写有意义。对于读负载,⾸⾏要填满挂载点,然后再启动IO,对于裸设备结点,这个设置
则没有什么意义,因为,它的⼤⼩已被被⽂件系统知道了,此外写的超出⽂件将不会返回ENOSPC.
<11>blockalign=int,ba=int
配置随机io的对齐边界。默认是与blocksize的配置⼀致,对于direct_io,最⼩为512b,因为它与依赖的硬件块⼤⼩,对于使⽤⽂件的随
机map来说,这个选项不起作⽤。
<14>blocksize_range=irange,bsrange=irange
不再采⽤单⼀的块⼤⼩,⽽是定义⼀个范围,fio将采⽤混合io块⼤⼩.IO单元⼤⼩⼀般是给定最⼩值的备数。同时应⽤于读写,当然也可以通
过‘,’来隔开分别配置读写。
<15>bssplit=str
可以更为精确的控制产⽣的block size.这个选项可以⽤来定义各个块⼤⼩所占的权重.格式是
bssplit=blocksize/percentage;blocksize/percentage
bssplit=4k/10:64k/50;32k/40
产⽣的这样的负载:50% 64k的块,10% 4k的块, 40% 32k的块
可以分别为读和写来设置
< bssplit=2k/50:4k/50,4k/90:8k/10
产⽣这样的负载:读(50% 64k的块,50% 4k的块),写(90% 4k的块, 10% 8k的块)
<16>blocksize_unaligned,bs_unaligned
如果这个选项被设置的,在bsrange范围内的⼤⼩都可以产⽣,这个选项对于direct io没有作⽤,因为对于direct io⾄少需要扇区对齐
<17>zero_buffers
如果这个选项设置的话,IO buffer全部位将被初始为0,如果没有置位的话,将会是随机数.
<18>refill_buffers
如果这个选项设置的话,fio将在每次submit之后都会将重新填满IO buffer,默认都会在初始是填满,以后重复利⽤。这个选项只有
在zero_buffers没有设置的话,这个选项才有作⽤。
<19>scramble_buffer=bool
如果refilee_buffers成本太⾼的话,但是负载要求不使⽤重复数据块,设置这个选项的话,可以轻微的改动IO buffer内容,这种⽅法骗不过聪
明的块压缩,但是可以骗过⼀些简单的算法。
<20>buffer_compress_percentage=int
如果这个设置的话,fio将会尝试提供可以压缩到特定级别的Buffer内容。FIO是能完提供混合的0和随机数来实现
的。Note that this is per block size unit, for file/disk wide compression level that matches this setting, you’ll also want to set refill_buffers.
<21>buffer_compress_chunk=int
<22>file_service_type=str
fio切换job时,如何选择⽂件,⽀持下⾯的选项
random 随机选择⼀个⽂件
roundrobin 循环使⽤打开的⽂件,默认
sequential 完成⼀个⽂件后,再移动到下⼀个⽂件
这个选项可以加后缀数字,标明切换到下⼀个新的频繁程度。
< random:4 每4次IO后,将会切换到⼀下随机的⽂件
<23>iodepth_batch_submit=int,iodepth_batch=int
这个定义了⼀次性提交⼏个IO,默认是1,意味着⼀旦准备好就提交IO,这个选项可以⽤来⼀次性批量提交IO
<24>iodepth_batch_complete=int
这个选项定义了⼀次取回多少个IO,如果定义为1的话,意味着我们将向内核请求最⼩
为1个IO.The IO retrieval will on until we hit the limit set by iodetph_low.If this variable is set to 0, then fi will always check for completed events befo
<25>iodepth_low=int
这个⽔位标志标明什么时候开始重新填充这个队列,默认是同iodepth是⼀样的,意味着,每时每刻都
在尝试填满这个队列。如果iodepth设
random翻译置为16,⽽iodepth设置为4的话,那么fio将等到depth下降到4才开始重新填充
<26>offset=int
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论