存儲設備與總線性能測試工具 Fio

本博客前面介紹的讀寫性能測試工具 Bonnie:https://blog.csdn.net/engrossment/article/details/83833287 以及 Bonnie++:https://blog.csdn.net/engrossment/article/details/84137801

Fio是一款 IO 性能測試工具,可用於測試CPU、網絡及存儲等多種設備的性能數據,它是一款工具,也是一個測試框架,支持用戶編寫自己的測試插件。Github 倉庫地址:https://github.com/axboe/fio

交叉編譯

在 x86 PC 上編譯:

HOST# ./configure
HOST# make

即可得到可執行程序 fio,運行使用即可。

交叉編譯在 ARM 平臺使用的 fio,以下以廣州創龍 TL5728-EasyEVM 爲例:

TARGET# source ~/57x/ti-processor-sdk-linux-rt-am57xx-evm-04.03.00.05/linux-devkit/environment-setup
TARGET# ./configure
TARGET# make CROSS_COMPILE=arm-linux-gnueabihf-
TARGET# file fio

最後可以看到生成的 fio 可執行程序的屬性。Fio 的跨平臺特性做得非常好。

Fio常用參數介紹

  • Fio 命令格式

fio  -filename=str  -ioengine=str  -iodepth=int   -iodepth_batch=int  -iodepth_low=int  -iodepth_batch_complete=int  -direct=int  -rw=str  -bs=str  -size=str  -numjobs=int  -thread  -group_reporting  -allow_mounted_write=int  -name=str  -userspace_reap  -ramp_time=int

  • filename

filename=str,待測試的儲存設備節點。e.g.:-filename=/dev/sda。

  • ioengine

ioengine=libaio,I/O測試引擎,定義測試任務向設備發起I/O的方式。

  • I/O深度

iodepth=int,異步I/O引擎使用的隊列深度值,默認值爲1。

Fio工具中iodepth配置的是整個測試任務所有線程的總隊列深度值,如果線程數量numjobs配置成4,隊列深度iodepth配置成128,那麼,每個線程使用的隊列深度爲128/4=32。

  • iodepth_batch

iodepth_batch=int,一次提交的I/O數量,默認值是iodepth。

  • iodepth_batch_complete

iodepth_batch_complete=int,定義了一次檢索多少個I/O數量,默認值爲1。

  • iodepth_low

iodepth_low=int,設置下次開始填充I/O閥值,默認值是iodepth。

libaio引擎調用io_setup準備可以存放iodepth個I/O請求的隊列。在壓力測試進行過程中,系統會生成特定的I/O請求,往I/O請求隊列裏面扔,當隊列裏面的I/O請求個數達到iodepth_batch值的時候,就調用io_submit批次提交請求,然後調用io_getevents開始處理已經完成的I/O。由於處理超時時間設置爲0,所以完成多少個就處理多少個,最多可以處理iodepth_batch_complete值個。隨着處理,I/O隊列裏面的請求數就減少,當I/O數目降到iodepth_low值的時候,就重新填充,保證OS可以看到至少iodepth_low數目的I/O請求在排隊。

如果I/O引擎是異步的,需要指定測試需要保持的隊列深度,默認對於每個文件來說是1,可以設置一個更大的值降低填隊列充次數,提高I/O請求處理效率。

  • I/O操作模式

direct=int,是否採用non-buffered io方式操作I/O。

參數爲1,則標明採用non-buffered io方式操作I/O,同O_DIRECT效果一樣,不使用I/O緩存,直接讀寫I/O。參數爲0,則標明採用buffered io。

  • I/O操作類型

rw=str,向文件發起的I/O操作類型,rw=read爲順序讀,rw=write爲順序寫。

  • bs(Block Size)

bs=int,I/O單元的大小。

可以是一個孤立的值,也可以是一個範圍。單次I/O的block size,默認值爲4k。如果是單個值的話,將會對讀寫都生效。如果是一個逗號,再跟一個int值的話,則是僅對於寫有效。

bs = 8k讀寫都使用8k的塊。

bs = 4k,8k讀使用4k的塊,寫使用8k的塊。

bs = ,8k寫採用8k的塊,讀採用默認的值(4k)。

  • size

size=int,每個線程讀/寫數據量。如果線程數numjobs配成4,size配成1G,那麼總測試數量=4 * 1G = 4G。

size選項一定要給出,可以是一個固定值,也可以給出一個1到100的百分比。e.g.: size=20%,Fio每個線程將會使用設備的20%的空間進行測試。

  • 線程/進程數

numjobs=int,創建大量的線程/進程來執行同一件事。

Fio默認使用進程測試,如果配置thread,則使用線程。

  • thread

thread,Fio使用線程測試模式。

  • group_reporting

group_reporting,以報告形式打印總測試結果。

  • name

name=str,任務名稱,可隨機命名,不可缺。

  • allow_mounted_write

allow_mounted_write=int,設置爲1,允許對儲存設備進行寫入數據,設置爲0,不允許進行寫入測試。

  • userspace_reap

提高異步I/O收割的速度。

  • ramp_time

ramp_time=int,單位秒,設定在記錄任何性能信息之前要運行特定負載的時間。這個用來等性能穩定後,再記錄日誌結果,以免開始測試時虛高數據也統計到性能中。

測試命令實例

考慮到不同數據總線、存儲外設的特點不同,需使用不一樣的測試配置。

適用於 Micro SD、eMMC、NAND 的數據讀取帶寬(吞吐量)測試如下。寫入測試把 -rw 配置爲 write 即可。

TARGET#  fio  -filename=/dev/mmcblk0  -ioengine=libaio  -iodepth=1   -iodepth_batch=1  -iodepth_low=1  -iodepth_batch_complete=1  -direct=1  -rw=read  -bs=1024K  -size=100M  -numjobs=1  -thread  -group_reporting  -name=read_job  -userspace_reap  -ramp_time=1

適用於 USB、SATA、PCIe 的數據讀取帶寬(吞吐量)測試如下。寫入測試把 -rw 配置爲 write 即可。其中 USB、PCIe 總線測試可以通過轉接線、轉接板轉爲外接性能強勁的 SSD 固態硬盤,進行測試。

TARGET#  fio  -filename=/dev/sda  -ioengine=libaio  -iodepth=128   -iodepth_batch=128  -iodepth_low=128  -iodepth_batch_complete=128  -direct=1  -rw=read  -bs=1024K  -size=1G  -numjobs=4  -thread  -group_reporting  -name=read_job  -userspace_reap  -ramp_time=1

2019年8月27日

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