天天看點

磁盤讀寫測試--基于fio工具

  改性能測試是基于fio工具做的磁盤的讀寫IOPS的測試。

1、測試主機資訊

主機:172.29.120.43

盤符:mpathc(以及多路徑sdd、sdg、sdj、sdm)

磁盤讀寫測試--基于fio工具

2、測試工具和用例

工具:fio

參數解析:

測試随機寫IOPS:

fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=1200  -group_reporting -filename=/web/1.txt -name=test      

測試随機讀IOPS:

fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=1200   -group_reporting -filename=/web/1.txt -name=test      

測試寫吞吐量:

fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=600  -group_reporting -filename=/web/2.txt  -name=test1      

測試讀吞吐量:

fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=1200  -group_reporting   -filename=/web/2.txt -name=test1      

詳細介紹:

參數 說明
direct

定義是否使用direct IO,可選值如下:

值為0,表示使用buffered IO

值為1,表示使用direct IO

iodepth

定義測試時的IO隊列深度,預設為1。

此處定義的隊列深度是指每個線程的隊列深度,如果有多個線程測試,意味着每個線程都是此處定義的隊列深度。fio總的IO并發數=iodepth * numjobs。

rw

定義測試時的讀寫政策,可選值如下:

随機讀:randread

随機寫:randwrite

順序讀:read

順序寫:write

混合随機讀寫:randrw

ioengine

定義fio如何下發IO請求,通常有同步IO和異步IO:

同步IO一次隻能發出一個IO請求,等待核心完成後才傳回。這樣對于單個線程IO隊列深度總是小于1,但是可以透過多個線程并發執行來解決。通常會用16~32個線程同時工作把IO隊列深度塞滿。

異步IO則通常使用libaio這樣的方式一次送出一批IO請求,然後等待一批的完成,減少互動的次數,會更有效率。

bs 定義IO的塊大小(block size),機關是k、K、m和M等,預設IO塊大小為4 KB。
size

定義測試IO操作的資料量,若未指定runtime這類參數,fio會将指定大小的資料量全部讀/寫完成,然後才停止測試。

該參數的值,可以是帶機關的數字,比如size=10G,表示讀/寫的資料量為10GB;也可是百分數,比如size=20%,表示讀/寫的資料量占該裝置總檔案的20%的空間。

numjobs 定義測試的并發線程數。
runtime

定義測試時間。

如果未配置,則持續将size指定的檔案大小,以每次bs值為分塊大小讀/寫完。

group_reporting 定義測試結果顯示模式,group_reporting表示彙總每個程序的統計資訊,而非以不同job彙總展示資訊。
filename

定義測試檔案(裝置)的名稱。

此處選擇檔案,則代表測試檔案系統的性能。例如:-filename=/opt/fiotest/fiotest.txt

此處選擇裝置名稱,則代表測試裸盤的性能。例:-filename=/dev/vdb1

須知:

如果在已經分區、并建立檔案系統,且已寫入資料的磁盤上進行性能測試,請注意filename選擇指定檔案,以避免覆寫檔案系統和原有資料。

name 定義測試任務名稱。

      direct:是否使用directIO,測試過程繞過OS自帶的buffer,使測試磁盤的結果更真實。Linux讀寫的時候,核心維護了緩存,資料先寫到緩存,後面再背景寫到SSD。讀的時候也優先讀緩存裡的資料。這樣速度可以加快,但是一旦掉電緩存裡的資料就沒了。是以有一種模式叫做DirectIO,跳過緩存,直接讀寫SSD

     iodepth=128: 隊列的深度為128.在異步模式下,CPU不能一直無限的發指令到SSD。比如SSD執行讀寫如果發生了卡頓,那有可能系統會一直不停的發指令,幾千個,甚至幾萬個,這樣一方面SSD扛不住,另一方面這麼多指令會很占記憶體,系統也要挂掉了。這樣,就帶來一個參數叫做隊列深度。

随機寫 rw=randwrite

随機讀 rw=randread

測試寫吞吐量 -rw=write

測試讀吞吐量 -rw=read

     ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地異步I/O。請注意,Linux可能隻支援具有非緩沖I/O的排隊行為(設定為“direct=1”或“buffered=0”);rbd:通過librbd直接通路CEPH Rados

bs=1024k 單次io的塊檔案大小為1024k

Size=2T  定義測試IO操作的資料量

      numjobs=1 每個job(任務)開1個線程,這裡用了幾,後面每個用-name指定的任務就開幾個線程測試。是以最終線程數=任務數(幾個name=jobx)* numjobs。

     runtime=600 測試時間為600 秒,如果不寫則一直将50G檔案分1024k每次寫完為止。

    group_reporting 關于顯示結果的,彙總每個程序的資訊。

    filename=/web/1.txt 測試檔案名稱,通常選擇需要測試的盤的data目錄。

    name=job1:一個任務的名字,重複了也沒關系。如果fio -name=job1 -name=job2,建立了兩個任務,共享-name=job1之前的參數。-name之後的就是job2任務獨有的參數。 

3、測試過程

測試随機寫IOPS

fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=600  -group_reporting -filename=/web/1.txt -name=test

磁盤讀寫測試--基于fio工具

   結果: write: IOPS=2972, BW=2972MiB/s (3117MB/s)(1742GiB/600259msec)

測試過程中iostat顯示:iostat -d -x -k 1

磁盤讀寫測試--基于fio工具

測試随機讀IOPS

fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=600   -group_reporting -filename=/web/1.txt -name=test

磁盤讀寫測試--基于fio工具

結果: read: IOPS=2252, BW=2253MiB/s (2362MB/s)(1320GiB/600058msec)

測試過程中iostat顯示:iostat -d -x -k 1

磁盤讀寫測試--基于fio工具

測試寫吞吐量

fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=600  -group_reporting -filename=/web/2.txt  -name=test1

結果: write: IOPS=3149, BW=3150MiB/s (3303MB/s)(1846GiB/600088msec)

測試過程中iostat顯示:iostat -d -x -k 1

磁盤讀寫測試--基于fio工具

測試讀吞吐量

fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=600  -group_reporting   -filename=/web/2.txt -name=test1

磁盤讀寫測試--基于fio工具

結果:read: IOPS=3311, BW=3311MiB/s (3472MB/s)(1940GiB/600069msec)

測試過程中iostat顯示:iostat -d -x -k 1

磁盤讀寫測試--基于fio工具

4、測試過程中top截圖

明顯看出系統整體負載在10%以上,wa值在4%,fio程序占用cpu1.3%左右,

磁盤讀寫測試--基于fio工具

5、測試結果

測試執行個體​
bs=1024k size=2T numjobs=16 runtime=600
測試結果​
IOPS BW 備注
随機寫 2972 2972MiB/s (3117MB/s)(1742GiB/600259msec)
随機讀 2252 2253MiB/s (2362MB/s)(1320GiB/600058msec)
寫吞吐 3149 3150MiB/s (3303MB/s)(1846GiB/600088msec)
讀吞吐 3311 3311MiB/s (3472MB/s)(1940GiB/600069msec)

  測試完畢.

6、資料庫SSD存儲測試用例:60線程、4k塊大小。

随機寫IOPS:
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=2T -numjobs=60 -runtime=1200  -group_reporting -filename=/web/1.txt -name=test

測試随機讀IOPS:
fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=2T -numjobs=60 -runtime=1200   -group_reporting -filename=/web/1.txt -name=test

測試寫吞吐量:
fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=4k -size=2T -numjobs=60 -runtime=600  -group_reporting -filename=/web/2.txt  -name=test1

測試讀吞吐量:
fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=4k -size=2T -numjobs=60 -runtime=1200  -group_reporting   -filename=/web/2.txt -name=test1