FIO Benchmark


一、簡介

FIO為Linux kernel的IO部分維護者axobe開發, Github:  https://github.com/axboe/fio。FIO的詳細使用方法參見自帶的HOWTO文件。
FIO一種IO系統的Benchmark和壓力測試工具,可以模擬不同IO場景下的IO負載。最初axobe設計FIO是為了節省為特定負載設計專門測試程序、進行性能測試,以及debug的時間。 寫測試程序非常浪費時間,因為不同的測試負載的IO場景不同,他們都用自己的方式產生IO,故需要模擬這些IO負載,FIO需足夠靈活。
FIO 支持 13 種不同的 I/O 引擎, 包括:sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet,guasi,solarisaio 等等。 FIO 的引擎能識別簡單易懂的job file文本去進行測試 ,同時能提供各種 I/O 性能指標,如I/O 延遲、IOPS和帶寬等。因此 被大量的制造商和廣泛的用戶認可,作為確認IO系統良好的測試工具。

二、典型工作過程

FIO命令行格式:fio [options] [job options] <job file(s)>

1. 運行過程

1)確定待模擬IO負載的IO參數,如I/O type,Block size,I/O engine,I/O depth,Target file/device等。可以配合fio的一些命令行參數來涉及I/O參數。如--parse-only或--showcmd等。
2)寫一個 job file來描述要simulate的 I/O 負載。一個 job 文件可以控制產生任意數目 的線程和文件。典型的 job 文件有一個 global 段(定義共享參數),一個或多個 job 段(描述具體要產生的 job)。
3)運行時,FIO 從文件讀這些參數,做處理,並根據這些參數描述,啟動這些simulate線 程/進程。
4)測試完成后,輸出測試結果。
5)對FIO測試結果進行分析,評估IO系統的設計或優化方案或確定debug思路。

2. 運行方式

按參數輸入方式分為如下兩種:
1) 命令行方式:如 FIO –filename=/dev/sdb –direct=1 –rw=randread –bs=4k –size=60G – numjobs=64 –runtime=10 –group_reporting –name=test
2) fio job_file 方式:如 job_file 的名字為 test,則運行方式為 fio test。
按FIO工作模式分為如下兩種:
1)client/server方式:FIO工作模式可以分為前端和后端,即client端和server端。server端執行fio --server,client端執行fio --client=hostname jobfile,這樣client端就可以把jobfile發到server端來執行,hostname為server端的IP。
2)本地執行:命令行/job file。

3. 命令行選項

FIO有很多有用的命令行選項,具體請直接查看fio --help或HOWTO文檔。這里簡單列出如下幾個:
  • --parse-only:僅解析configuration文件的參數使用是否正確;
  • --output:結果輸入到一個文件中;
  • --cmdhelp=cmd:打印某個命令的幫助文檔;
  • --showcmd:解析配置文件並轉化成命令行參數;

三、常用參數

1) IO type:表示 I/O 類型,Read Write;包括:Read 順序讀、 Write 順序寫、 RandWrite 隨機寫、 RandRead 隨機讀。 例如:rw=randwrite。
2) Block Size: 測試工具向被測設備發出的讀寫數據塊的大小,可以是一個單獨的 值,也可以是一個范圍。 例如:blocksize=4k, 4K 是主流,8K 是 Mysql和 Oracle,16K 是 MysqlInnodb。
3) IO engine: I/O 引擎,處理 IO 的方式,定義了發起 IO 的方式,可以是內存映 射文件,可以是使用普通的讀/寫,我們可以使用 splice,異步 IO,syslet,甚至 SG (SCSI generic sg) 。包括 sync,pync,vsync,libaio 等,目前使用最廣泛的 是 libaio。
  • Sync:基本的read,write。通過lseek來作定位;
  • Psync:基本的pread,pwrite,在文件描述符給定的位置偏移上讀取或寫入數據,pread() 從文件 fd 指定的偏移 offset (相對文件開頭) 上讀取 count 個字節到buf 開始位置。文件當前位置偏移保持不變。 pwrite() 把緩存區 buf 開頭的 count個字節寫入文件描述符 fd offset 偏移位置上,文件偏移沒有改變。 fd 引用的文件必須是可定位的,屬於同步I/O;
  • Vsync:基本的 readv, writev;
  • Libaio: Linux 專有的異步 IO,Linux 僅支持非 buffered IO 的隊列行為;
注意
  • 同步和異步的區別:同步 IO 是指,進程觸發 IO 操作后,后面的操作不能進行,只能等待 IO 操作完成或者放棄 IO 操作,保證當前只有一個 IO 操作在進行。異步 IO 是指,觸發 IO 操作以后,直接返回,可以繼續執行后面的操作,IO 交給內核來處理,完成后內核通知進程 IO 完成。
  • libaio 引擎會用這個 iodepth 值來調用 io_setup,准備可以一次提交iodepth 個 IO 的上下文,同時申請iodepth個 io 請求隊列用於保持 IO。在壓測進行的時候,系統會生成特定的 IO 請求,往 io 請求隊列里面提交,當隊列里面的IO個數達到 iodepth_batch值的時候,就調用 io_submit 批次提交請求,然后開始調用 io_getevents 開始收割已經完成的 IO。每次收割多少呢?由於收割的時候,超時時間設置為 0,所以有多少已完成的 IO 就收割多少,最多可以收割 iodepth_batch_complete 個 IO。隨着收割,IO 隊列里面的 IO 數就少了,那么需要補充新的 IO。什么時候補充呢?當 IO 數目降到 iodepth_low 值的時候,就重新填充,保證 OS 可以看到至少 iodepth_low 數目的 io 在電梯口排隊着。
  • libaio,這個是追求 IOPS 的;對於延時為主的測試,建議使用 psync。
4) IO size: 總共要讀寫的數據大小。 例如:size=200G
5) IO depth:測試的隊列深度,隊列深度表示控制器可同時發送給被測設備的指令數 目。在 ATA 指令集的 Read/Write FP DMA Queue 指令中,可以給每個讀寫指令 帶上標簽。當隊列深度為1時,控制器需要等待被測設備完成指令並返回結果后才 可執行下一條指令;當隊列深度大於 1 時,控制器可以向被測設備發出多條指令, 並給每個指令附帶一個標簽作為指令號,此時被測設備並不按照指令號的順序返回 結果,從而可根據自身 Firmware 算法進行優化,尋找最容易得到的結果並反饋給 控制器。當某一條指令的結果返回之后,該標簽被回收並可再次利用。針對 SATA 硬盤或 SSD,需要控制器工作在 AHCI 模式並且操作系統加載 AHCI 驅動程序且被 測設備本身要支持 NCQ 才能支持此種訪問模式。按照上述原理,在隊列深度增加 時,被測設備的訪問效率將有明顯提升,故性能也有相應提升。 默認對於每個文件 來說是 1,可以設置一個更大的值來提高並發度。 例如:iodepth=1
6) IO type:表示我們將執行 buffered io 還是 direct/raw io。 ZFS 和 Solaris 不支持 direct io,在 windows 上同步 IO 引擎不支持 direct io。 Direct=0 時,則表明采 用 buffered io。 例如:direct=1
7) Num files: 表示負載將分發到幾個文件中。 例如:nrfiles=8
8) Num threads: 創建多少個進程/線程來並發執行。 例如:numjobs=1。 numjobs 建議等於 CPU 的 core 值,即 HT=off。
9) Runtime: 測試運行時間。 例如:runtime=30
10)數據填充方式: 當進行數據寫入時,可選擇寫入數據的形式。此選項可選三種模式, 分別為重復填充、偽隨機填充、隨機填充。重復填充表示全 0 的數據寫入,當 SSD 主控支持數據壓縮功能時,大量的全 0 數據將以壓縮的方式寫入 SSD 從而顯著提 高性能;偽隨機填充寫入即為偽隨機數的填充寫入,由於生成隨機數需要花費大量 時間,故在通常測試中,為減少等待時間,一般選擇偽隨機數填充。在選擇偽隨機 數寫入后,SSD 主控即使支持數據壓縮功能也不能夠對偽隨機數進行壓縮;全隨機 填充即為先進行隨機數生成,之后再進行寫入。隨機數生成會消耗大量時間,通常 測試中不采用此種模式。 例如:refill_buffers
11) percentage_random:隨機和順序比率; 例如:percentage_random=80,80%的隨機。
12) time_based :決定腳本的運行時間,即使 file 已被完全讀寫或寫完,也要執行完 runtime 規定的時間。它是通過循環執行相同的負載來實現的。 例如:time_based。
13) 目標盤符/被測盤符:當需要測試多個磁盤時,需要增加多行以下內容, 例如: filename=/dev/sdb; 如果寫在配置文件中,則需創建多個job區分多個不同的測試目標設備;

四、結果分析

1. slat:submission latency提交延遲,意思為“how long did it take to submit this IO to the kernel for processing?”;
2. clat:completion latency完成延遲,意思為“This is the time that passes between submission to the kernel and when the IO is complete, not including submission latency”;
3. clat percentiles:描述IO整體延遲latency distribution,為不同百分比IO的clat。可以根據這些百分比數來繪制圖形,從整體上分析IO系統的IO延時。這是非常有用的一個用來描述IO系統延時情況的指標,例如可以比較TP99、TP90等性能指標。
4. IO depths:這個iodepth設置是用來控制在任意給定時刻,有多少個IO被提交給OS。這個參數完全是應用端來設置,與IO設備的IO queue不同。summit和complete表明fio一次提交多少個IO,或一次完成多少個IO。

Reference

1. FIO_HOWTO,見附件;

附件列表

     


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM