改性能測試是基于fio工具做的磁盤的讀寫IOPS的測試。
1、測試主機資訊
主機:172.29.120.43
盤符:mpathc(以及多路徑sdd、sdg、sdj、sdm)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1gjNkdjZkdDMkBzY5IzNilTO3EWZjJzYjV2M3kDMwczY2UTZzczLcJDMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
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
結果: write: IOPS=2972, BW=2972MiB/s (3117MB/s)(1742GiB/600259msec)
測試過程中iostat顯示:iostat -d -x -k 1
測試随機讀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
結果: read: IOPS=2252, BW=2253MiB/s (2362MB/s)(1320GiB/600058msec)
測試過程中iostat顯示:iostat -d -x -k 1
測試寫吞吐量
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 -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=1024k -size=2T -numjobs=16 -runtime=600 -group_reporting -filename=/web/2.txt -name=test1
結果:read: IOPS=3311, BW=3311MiB/s (3472MB/s)(1940GiB/600069msec)
測試過程中iostat顯示:iostat -d -x -k 1
4、測試過程中top截圖
明顯看出系統整體負載在10%以上,wa值在4%,fio程序占用cpu1.3%左右,
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