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 Linux專有的異步IO。Linux僅支持非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隊列深度是我們想要的。這個可以參考褚霸的博客http://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的塊

可以分別爲讀和寫來設置

e.g. 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

See buffer_compress_percentage. This setting allows fio to manage how big the ranges of random data and zeroed data is. Without this set, fio will provide buffer_compress_percentage of blocksize random data, followed by the remaining zeroed. With this set to some chunk size smaller than the block size, fio can alternate random and zeroed data throughout the IO buffer.

<22>file_service_type=str

fio切換job時,如何選擇文件,支持下面的選項

random 隨機選擇一個文件 

roundrobin 循環使用打開的文件,默認

sequential 完成一個文件後,再移動到下一個文件

這個選項可以加後綴數字,標明切換到下一個新的頻繁程度。

e.g. 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 go 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 before quuing more IO.This helps reduce IO latency, at the cost of more retrieval sysstem calls.

<25>iodepth_low=int

這個水位標誌標明什麼時候開始重新填充這個隊列,默認是同iodepth是一樣的,意味着,每時每刻都在嘗試填滿這個隊列。如果iodepth設置爲16,而iodepth設置爲4的話,那麼fio將等到depth下降到4纔開始重新填充

<26>offset=int

在文件特定的偏移開始讀數據,在這個offset之前的數據將不會被使用,有效的文件大小=real_size-offset

<27>offset_increment=int

如果這個選項被設置的話,實際的offset=offset+offset_increment * thread_number,線程號是從0開始的一個計數器,對於每一個job來說是遞增的。這個選項對於幾個job同時並行在不交界的地方操作一個文件是有用的。

<28>fsync=int

如果寫一個文件的話,每n次IO傳輸完block後,都會進行一次同步髒數據的操作。

e.g. fsync=int

fio每32次寫之後,同步一次文件。如果採用non-buffered io,不需要使用sync同步文件

對於sg io引擎的話,可以在任何情況下同步磁盤cache.

<29>fdatasync=int

同fsync,但是採用fdatasync()來同步數據,但不同步元數據

<30>sync_file_range=str:val

對於每‘val’個寫操作,將執行sync_file_range()。FIO將跟蹤從上次sync_file_range()調用之扣的寫範圍,‘str’可以是以下的選擇

wait_before SYNC_FILE_RANGE_WAIT_BEFORE

write SYNC_FILE_RANGE_WRITE

wait_after SYNC_FILE_RANGE_WAIT_AFTER

e.g.sync_file_range=wait_before,write:8,fio將在每8次寫後使用SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE

<31>overwrite=bool

如果是true的話,寫一個文件的話,將會覆蓋已經存在的數據。如果文件不存在的話,它將會在寫階段開始的時候創建這個文件。

<32>end_fsync=bool

如果是true的話,當job退出的話,fsync將會同步文件內容

<33>fsync_on_close=bool

如果是true的話,關閉時,fio將會同步髒文件,不同於end_fsync的時,它將會在每個文件關閉時都會發生,而不是隻在job結束時。

<34>rwmixread=int

混合讀寫中,讀佔的百分比

<35>rwmixwrite=int

混合讀寫中,寫佔的百分比;如果rwmixread=int和rwmixwrite=int同時使用的話並且相加不等於100%的話,第二個值將會覆蓋第一個值。這可能要干擾比例的設定,如果要求fio來限制讀和寫到一定的比率。在果在這種情況下,那麼分佈會的有點的不同。

<36>norandommap

一般情況下,fio在做隨機IO時,將會覆蓋文件的每一個block.如果這個選項設置的話,fio將只是獲取一個新的隨機offset,而不會查詢過去的歷史。這意味着一些塊可能沒有讀或寫,一些塊可能要讀/寫很多次。在個選項與verify=互斥,並只有多個塊大小(bsrange=)正在使用,因爲fio只會記錄完整的塊的重寫。

<37>softrandommap=bool

See norandommap. If fio runs with the random block map enabled and it fails to allocate the map, if this option is set it will continue without a random block map. As coverage will not be as complete as with random maps, this option is disabled by default.

<38>nice=int

根據給定的nice值來運行這個job

<39>prio=int

設置job的優先級,linux將這個值限制在0-7之間,0是最高的。

<40>prioclass=int

設置優先級等級。

<41>thinktime=int

上一個IO完成之後,拖延x毫秒,然後跳到下一個。可以用來訪真應用進行的處理。

<42>thinktime_spin=int

只有在thinktime設置時纔有效,在爲了sleep完thinktime規定的時間之前,假裝花費CPU時間來做一些與數據接收有關的事情。

<43>thinktime_blocks

只有在thinktime設置時纔有效,控制在等等‘thinktime’的時間內產生多少個block,如果沒有設置的話,這個值將是1,每次block後,都會將等待‘thinktime’us。

<44>rate=int

限制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

<45>ratemin=int

告訴fio盡最在能力來保證這個最小的帶寬,如果不能滿足這個需要,將會導致程序退出。

<46>rate_iops=int

將帶寬限制到固定數目的IOPS,基本上同rate一樣,只是獨立於帶寬,如果job是指定了一個block size範圍,而不是一個固定的值的話,最小blocksize將會作爲標準。

<47>rate_iops_min=int

如果fio達不到這個IOPS的話,將會導致job退出。

<48>ratecycle=int

幾個毫秒內的平均帶寬。用於‘rate’和‘ratemin’

<49>cpumask=int

設置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.

<50>cpus_allowed=str

功能同cpumask一樣,但是允許通過一段文本來設置允許的CPU。e.g.上面的例子可是這樣寫cpus_allowed=1,5。這個選項允許設置一個CPU範圍,如cpus_allowed=1,5,8-15

<51>startdelay=time

fio啓動幾秒後再啓動job。只有在job文件包含幾個jobs時纔有效,是爲了將某個job延時幾秒後執行。

<52>runtime=time

控制fio在執行設定的時間後退出執行。很難來控制單個job的運行時間,所以這個參數是用來控制總的運行時間。

<53>time_based

如果設置的話,即使file已被完全讀寫或寫完,也要執行完runtime規定的時間。它是通過循環執行相同的負載來實現的。

<54>ramp_tim=time

設定在記錄任何性能信息之前要運行特定負載的時間。這個用來等性能穩定後,再記錄日誌結果,因此可以減少生成穩定的結果需要的運行時間。Note that the ramp_time is considered lead in time for a job, thus it will increase the total runtime if a special timeout or runtime is specified.

<55>invalidate=bool

Invalidate the buffer/page cache parts for this file prior to starting io. Defaults to true.

<56>sync=bool

使用sync來進行buffered寫。對於多數引擎,這意味着使用O_SYNC

<57>iomem=str,mem=str

fio可以使用各種各樣的類型的內存用來io單元buffer.

malloc 使用malloc()

shm 使用共享內存.通過shmget()分配

shmhuge 同shm一樣,可以使用huge pages

mmap 使用mmap。可以是匿名內存,或是支持的文件,如果一個文件名在選項後面設置的話,格式是mem=mmap:/path/to/file

mmaphuge 使用mmapped huge file.在mmaphuge扣面添加文件名,alamem=mmaphuge:/hugetlbfs/file

分配的區域是由job允許的最大block size * io 隊列的長度。對於shmhuge和mmaphuge,系統應該有空閒的頁來分配。這個可以通過檢測和設置reading/writing /proc/sys/vm/nr_hugepages來實現(linux)。FIO假設一個huge page是4MB。所以要計算對於一個JOB文件需要的Huge page數量,加上所有jobs的隊列長度再乘以最大塊大小,然後除以每個huge page的大小。可以通過查看/proc/meminfo來看huge pages的大小。如果通過設置nr_hugepages=0來使得不允許分配huge pages,使用mmaphug或是shmhuge將會失敗。

mmaphuge需要掛載hugelbfs而且要指定文件的位置,所以如果要掛載在/huge下的話,可以使用mem=mmaphuge:/huge/somefile

<58>iomem_align=int

標明IO內存緩衝的內存對齊方式。Note that the given alignment is applied to the first IO unit buffer, if using iodepth the alignment of the following buffers are given by the bs used. In other words, if using a bs that is a multiple of the page sized in the system, all buffers will be aligned to this value. If using a bs that is not page aligned, the alignment of subsequent IO memory buffers is the sum of the iomem_align and bs used.

<59>hugepage-size=int

設置huge page的大小。至少要與系統的設定相等。默認是4MB,必然是MB的倍數,所以用hugepage-size=Xm是用來避免出現不是2的整數次方的情況。

<60>exitall

當一個job退出時,會終止運行其它的job,默認是等待所有的job都完成,FIO才退出,但有時候這並不是我們想要的。

<61>bwavgtime=int

在給定時間內的平均帶寬。值是以毫秒爲單位的

<62>iopsavgtime=int

在給定時間內的平均IOPS,值是以毫秒爲單位的

<63>create_serialize=bool

job將會串行化創建job,這將會用來避免數據文件的交叉,這依賴於文件系統和系統的CPU數

<64>create_fsync=bool

創建後同步數據文件,這是默認的值

<65>create_on_open=bool

不會爲IO預先創建文件,只是在要向文件發起IO的時候,才創建open()

<66>create_only=bool

如果設置爲true的話,fio將只運行到job的配置階段。如果文件需要部署或是更新的磁盤的話,只有上面的事纔會做,實際的文件內容並沒有執行。

<67>pre_read=bool

如果這個選項被設置的話,在執行IO操作之前,文件將會被預讀到內存.這會刪除‘invalidate’標誌,因爲預讀數據,然後丟棄cache中的數據的話,是沒有意義的。這只是對可以seek的IO引擎有效,因爲這允許讀相同的數據多次。因此對於network和splice不起作用。

<68>unlink=bool

完成後將刪除job產生的文件。默認是not,如果設置爲true的話,將會花很多時間重複創建這些文件。

<69>loops=int

重複運行某個job多次,默認是1

<70>do_verify=bool

寫完成後,執行一個校驗的階段,只有當verify設置的時候纔有效。默認是true

<80>verify=str

寫一個文件時,每次執行完一個job扣,fio可以檢驗文件內容.允許的校驗算法是:

md5,crc64,crc32c,crc32c-intel,crc32,crc16,crc7,sha512,sha256,sha1,meta,null.

這個選項可以用來執行重複的burn-in測試,來保證寫數據已經正確的讀回。如果是read或隨機讀,fio將假設它將會檢驗先前寫的文件。如果是各種格式的寫,verify將會是對新寫入的數據進行校驗。

<81>verifysort=bool

如果設置的話,fio will sort written verify blocks when it deems it faster to read them back in a sorted manner. This is often the case when overwriting an existing file, since the blocks are already laid out in the file system. You can ignore this option unless doing huge amounts of really fast IO where the red-black tree sorting CPU time becomes significant.

<82>verify_offset=int

Swap the verification header with data somewhere else in the block before writing. Its swapped back before verifying.

<83>verify_interval=int

Write the verification header at a finer granularity than the blocksize. It will be written for chunks the size of header_interval. blocksize should divide this evenly

<84>verify_pattern=str

<85>verify_fatal=bool

<86>verify_dump=bool

<87>verify_async=int

<88>verify_async_cpus=str

<89>verify_backlog=int

<90>verify_backlog_batch=int

<91>stonewall,wait_for_previous

等待先前的job執行完成後,再啓動一個新的job。可以用來在job文件中加入串行化的點。stone wall也用來啓動一個新reporting group

<92>new_group

啓動一個新的reporting group。如果這個選項沒有設置的話,在job文件中的job將屬於相同的reporting group,除非通過stonewall隔開

<93>group_reporting

如果‘numjobs’設置的話,我們感興趣的可能是打印group的統計值,而不是一個單獨的job。這在‘numjobs’的值很大時,一般是設置爲true的,可以減少輸出的信息量。如果‘group_reporting’設置的話,fio將會顯示最終的per-groupreport而不是每一個job都會顯示

<94>thread

fio默認會使用fork()創建job,如果這個選項設置的話,fio將使用pthread_create來創建線程

<95>zonesize=int

將一個文件分爲設定的大小的zone

<96>zoneskip=int

跳過這個zone的數據都被讀完後,會跳過設定數目的zone.

<97>write_iolog=str

將IO模式寫到一個指定的文件中。爲每一個job指定一個單獨的文件,否則iolog將會分散的的,文件將會衝突。

<98>read_iolog=str

將開一個指定的文件,回覆裏面的日誌。這可以用來存儲一個負載,並進行重放。給出的iolog也可以是一個二進制文件,允許fio來重放通過blktrace獲取的負載。

<99>replay_no_stall

當使用read_iolog重放I/O時,默認是嘗試遵守這個時間戳,在每個IOPS之前會有適當的延遲。通過設置這個屬性,將不會遵守這個時間戳,會根據期望的順序,嘗試回覆,越快越好。結果就是相同類型的IO,但是不同的時間

<101>replay_redirect

當使用read_iolog回放IO時,默認的行爲是在每一個IOP來源的major/minor設備上回放IOPS。這在有些情況是不是期望的,比如在另一臺機器上回放,或是更換了硬件,使是major/minor映射關係發生了改變。Replay_redirect將會導致所有的IOPS回放到單個設備上,不管這些IO來源於哪裏。e.g.replay_redirect=/dev/sdc將會使得所有的IO都會重定向到/dev/sdc.這就意味着多個設備的數據都會重放到一個設置,如果想來自己多個設備的數據重放到多個設置的話,需要處理我們的trace,生成獨立的trace,再使用fio進行重放,不過這會破壞多個設備訪問的嚴格次序。

<102>write_bw_log=str

在job file寫這個job的帶寬日誌。可以在他們的生命週期內存儲job的帶寬數據。內部的fio_generate_plots腳本可以使用gnuplot將這些文本轉化成圖。

<103>write_lat_log=str

同write_bw_log類似,只是這個選項可以存儲io提交,完成和總的響應時間。如果沒有指定文件名,默認的文件名是jobname_type.log。即使給出了文件名,fio也會添加兩種類型的log。

e.g.如果我們指定write_lat_log=foo

實際的log名將是foo_slat.log,foo_slat.log和foo_lat.log.這會幫助fio_generate_plot來自動處理log

<104>write_iops_log=str

類似於write_bw_log,但是寫的是IOPS.如果沒有給定文件名的話,默認的文件名是jobname_type.log。

<105>log_avg_msec=int

默認,fio每完成一個IO將會記錄一個日誌(iops,latency,bw log)。當向磁盤寫日誌的時候,將會很快變的很大。設置這個選項的話,fio將會在一定的時期內平均這些值,指少日誌的數量,默認是0

<106>lockmem=int

使用mlock可以指定特定的內存大小,用來訪真少量內存

<107>exec_preren=str

運行job之前,通過過system執行指定的命令

<108>exec_postrun=str

job執行完成後,通過system執行指定的命令

<109>ioscheduler=str

在運行之前,嘗試將文件所在的設備切換到指定的調度器。

<110>cpuload=int

如果job是非常佔用CPU週期的,可以指定戰勝CPU週期的百分比。

<120>cpuchunks=int

如果job是非常戰勝CPU週期的,將load分拆爲時間的cycles,以毫秒爲單位

<121>disk_util=bool

產生磁盤利用率統計信息。默認是打開的

<122>disable_lat=bool

延遲的有效數字。Disable measurements of total latency numbers. Useful only for cutting back the number of calls to gettimeofday,as that does impact performance at really high IOPS rates.Note that to really get rid of a large amount of these calls, this option must be used with disable_slat and disable_bw as well.

<123>disable_clat=bool

<124>disable_slat_bool

<125>disable_bw=bool

<126>clat_percentiles=bool

允許報告完成完成響應時間的百分比

<127>percentile_list=float_list

<128>gtod_reduce=bool

<129>gtod_cpu=int

<130>continue_on_error=str

一般情況下,一旦檢測到錯誤,fio將會退出這個job.如果這個選項設置的話,fio將會一直執行到有‘non-fatal錯誤‘(EIO或EILSEQ)或是執行時間耗完,或是指定的I/Osize完成。如果這個選項設置的話,將會添加兩個狀態,總的錯誤計數和第一個error。允許的值是

none 全部IO或檢驗錯誤後,都會退出

read 讀錯誤時會繼續執行,其它的錯誤會退出

write 寫錯誤時會繼續執行,其它的錯誤會退出

io 任何IO error時會繼續執行,其它的錯誤會退出

verify 校驗錯誤時會繼續執行,其它的錯誤會退出

all 遇到所有的錯誤都會繼續執行

<131>cgroup=str

<132>cgroup_weitht=int

<133>cgroup_weight=int

<134>cgroup_nodelete=bool

<135>uid=int

不是使用調用者的用戶來執行,而是指定用戶ID

<136>gid=int

設置group id

<137>flow_id=int

<138>flow=int

<139>flow_watermark=int

<140>flow_sleep=int

下面的參數只對指定的IO引擎有效:

[libaio] userspace_reap

[netsplice]hostname=str

[net]hostname=str

[netsplice]port=int

[netsplice]proto=str

[net]protocol=str

[net]proto=str

[net]listen

輸出

在運行時,fio將打印當前job創建的狀態

e.g.

Threads: 1: [_r] [24.8% done] [ 13509/  8334 kb/s] [eta 00h:01m:31s]

生命週期

P   線程已經啓動,還沒有啓動

C 線程啓動

I 純種已經初始化,等待中

p 線程運行中,預讀文件

R 順序讀

r 隨機讀

W 順序寫

w 隨機寫

M 混合順序讀寫

m 混合隨機讀寫

F 等待執行fsync()

V 運行,檢驗寫的數據

E 線程退出,還沒有被主線程獲取狀態

_ Thread reaped, or

X Thread reaped, exited with an error.

K Thread reaped, exited due to signal.

 

其它的值都是可以自解釋的:

當前正在運行的IO線程數。

從上次檢查之後的IO速度(讀速度/寫速度)

估計的完成百分比

整個group的估計完成時間

 

當fio完成的時候(或是通過ctrl-c終止的時候),將會打印每一個線程的數據,每個group的數據,和磁盤數據。

 

io= 執行了多少M的IO

bw= 平均IO帶寬

iops=   IOPS

runt= 線程運行時間

slat 提交延遲

clat 完成延遲

lat響應時間

bw 帶寬

cpu利用率

IO depths=io隊列

IO submit=單個IO提交要提交的IO數

IO complete= Like the above submit number, but for completions instead.

IO issued= The number of read/write requests issued, and how many

of them were short.

IO latencies=IO完延遲的分佈

 

io= 總共執行了多少size的IO

aggrb= group總帶寬

minb= 最小平均帶寬.

maxb= 最大平均帶寬.

mint= group中線程的最短運行時間.

maxt= group中線程的最長運行時間.

 

ios= 所有group總共執行的IO數.

merge= 總共發生的IO合併數.

ticks= Number of ticks we kept the disk busy.

io_queue= 花費在隊列上的總共時間.

util= 磁盤利用率

 

爲了便於腳本分析,可能需要將結果生成表或圖,fio可以生成以分號分割的結果。

trace文件格式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章