本博客前面介紹的讀寫性能測試工具 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日