fio是測試磁盤性能的一個非常好的工具,用來對硬件進行壓力測試和驗證。
注意事項
CentOS 6.5
等較老版本的操作系統用fdisk創建分區時,默認為非4KB對齊選擇初始磁柱編號,對性能有較大的影響,建議針對該類操作系統,在創建分區時4KB對齊選取初始磁柱編號。- 請不要在系統盤上進行fio測試,避免損壞系統重要文件。
- 測試硬盤性能時,建議直接測試裸數據盤(如 /dev/vdb)。
- 測試文件系統性能時,推薦指定具體文件測試(如 /data/file)。
- fio測試建議在空閑的、未保存重要數據的磁盤上進行,並在測試完成后重新創建文件系統。
參數
參數名 | 說明 | 取值樣例 |
---|---|---|
name | 定義測試任務名稱 | N/A |
filename | 測試對象,即待測試的磁盤設備名稱。 | N/A |
bs | 每次請求的塊大小。取值包括4k、8k及16k等。 | 4k |
bsrange | bsrange=512-2048 數據塊的大小范圍 |
N/A |
size | I/O 測試的尋址空間。也可是百分數,比如size=20%,表示讀/寫的數據量占該設備總文件的20%的空間 | 100GB |
ioengine | I/O 引擎。推薦使用 Linux 的異步 I/O 引擎。 | libaio |
iodepth | 請求的 I/O 隊列深度。此處定義的隊列深度是指每個線程的隊列深度,如果有多個線程測試,意味着每個線程都是此處定義的隊列深度。fio總的I/O並發數=iodepth * numjobs。 | 1 |
numjobs | 定義測試的並發線程數。 | 1 |
direct | 定義是否使用direct I/O,可選值如下:值為0,表示使用buffered I/O值為1,表示使用direct I/O | 1 |
rw | 讀寫模式。取值包括順序讀(read)、順序寫(write)、隨機讀(randread)、隨機寫(randwrite)、混合隨機讀寫(randrw)和混合順序讀寫(rw,readwrite)。 | read |
rwmixwrite | rwmixwrite=30 在混合讀寫的模式下,寫占30% | |
time_based | 指定采用時間模式。無需設置該參數值,只要 FIO 基於時間來運行。 | N/A |
runtime | 指定測試時長,即 FIO 運行時長。 | 600 |
refill_buffers | FIO 將在每次提交時重新填充 I/O 緩沖區。默認設置是僅在初始時填充並重用該數據。 | N/A |
norandommap | 在進行隨機 I/O 時,FIO 將覆蓋文件的每個塊。若給出此參數,則將選擇新的偏移量而不查看 I/O 歷史記錄。 | N/A |
randrepeat | 隨機序列是否可重復,True(1)表示隨機序列可重復,False(0)表示隨機序列不可重復。默認為 True(1)。 | 0 |
group_reporting | 多個 job 並發時,打印整個 group 的統計值。 | N/A |
常用測試場景
測試延遲
隊列深度為1,bs設置為4k,也就是模擬單個隊列讀寫的延遲測試
吞吐
隊列深度為32,bs設置為128k,測試最大能力去跑滿整個磁盤帶寬
iops
隊列深度為32,bs設置為4k,要在最短的時間內多去讀磁盤
小文件通常測試隨機讀寫,大文件通常測試順序讀寫。
測試順序讀IOPS
fio -name=Seq_Read_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=read -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=4k -size=10G -numjobs=1 -runtime=600 -filename=/dev/[device]
測試順序寫IOPS
fio -name=Seq_Write_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=write -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=4k -size=10G -numjobs=1 -runtime=600 -filename=/dev/[device]
測試隨機寫IOPS
fio -name=Rand_Write_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=4k -size=10G -numjobs=1 -runtime=600 -filename=/dev/[device]
測試隨機讀IOPS
fio -name=Rand_Read_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=4k -size=10G -numjobs=1 -runtime=600 -filename=/dev/[device]
測試混合讀寫
fio -name=Read_Write_IOPS_Test -group_reporting -direct=1 -iodepth=128 -rw=randrw -rwmixread=70 -refill_buffers -norandommap -randrepeat=0 -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600 -ioscheduler=noop
測試寫吞吐量
fio -name=Write_BandWidth_Test -group_reporting -direct=1 -iodepth=32 -rw=write -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=1024k -size=10G -numjobs=1 -runtime=600 -filename=/dev/[device]
測試讀吞吐量
fio -name=Read_BandWidth_Test -group_reporting -direct=1 -iodepth=32 -rw=read -ioengine=libaio -refill_buffers -norandommap -randrepeat=0 -bs=1024k -size=10G -numjobs=1 -runtime=600 -filename=/dev/[device]
測試結果輸出指標
- IOPS:每秒讀/寫次數,單位為次(計數)。存儲設備的底層驅動類型決定了不同的 IOPS。 --> iops
- 吞吐量:每秒的讀寫數據量,單位為MB/s。 --> bw
- 時延:I/O 操作的發送時間到接收確認所經過的時間,單位為秒。 --> lat (msec)
- runt:總運行時間