沒用過 Fio 的請先參考使用介紹 http://benjr.tw/34632
測試環境為 CentOS 7 x86_64 (虛擬機)
效能測試需求如下:
- Hard drive – /dev/sdb
- iodepth – 4
- block size – 4k , 32k
- RW – 100% Read , 100% write
直接使用 Fio Job file (configuration) 檔案來設定會比較適合完整的效能測試,先編輯好我們要測試的不同參數值,Job file 兩段 [global] : 共用的設定參數 , [job] :特別指定的參數.
[root@localhost ~]# vi fio.cfg [global] filename=/dev/sdb direct=1 ioengine=libaio time_based runtime=10 iodepth=4 refill_buffers group_reporting wait_for_previous ramp_time=5 [JOB1] bs=4k rw=read [JOB2] bs=32k rw=read [JOB3] bs=4k rw=write [JOB4] bs=32k rw=write
使用參數說明:
- filename
指定要測試的磁碟. - direct
預設值為 0 ,必須設定為 1 才會測試到真實的 non-buffered I/O. - ioengine
定義如何跑 I/O 的方式, libaio 是 Linux 本身非同步(asynchronous) I/O 的方式.
其他還有 sync , psync , vsync , posixaio , mmap , splice , syslet-rw , sg , null , net , netsplice , cpuio , guasi , external. - time_based
測試以時間為單位,另外一種方式是以 kb_base (kilobyte). - runtime
這一測試所需的時間,單位為 秒. - iodepth=16
同一時間有多少 I/O 在做存取,越多不代表存儲裝置表現會更好,通常是 RAID 時須要設大一點. - refill_buffers
refill_buffers 為預設值,應該是跟 I/O Buffer 有關 (refill the IO buffers on every submit),把 Buffer 填滿就不會跑到 Buffer 的值. - group_reporting
如果 numjobs 有指定,設定 group_reporting 報告會以 per-group 的顯示方式,而不是預設的 per-job (會顯示所有個別 numjobs 的測試結果) - wait_for_previous
預設所有的 Job 會一起執行,wait_for_previous 可以讓依序一個接著一個執行. - ramp_time
設定 ramp_time 會讓測試開始的一段時間不統計到整體效能裡. - bs=4k
bs 或是 blocksize ,也就是檔案寫入大小,預設值為 4K,如何設定這個值,因為不同性質的儲存裝置需要不同的值.看你是 File Server,Web server , Database … 設定都會不一樣. - rw
可以設定的參數如下,通常在跑效能時會使用單純的 read 與 write,其他可以使用參數如下:- read : Sequential reads. (循序讀)
- write : Sequential writes. (循序寫)
- trim : Sequential trim.
- randread : Random reads. (隨機讀)
- randwrite : Random writes. (隨機寫)
- randtrim : Random trim.
- rw : Mixed sequential reads and writes. (循序讀寫)
- readwrite : Sequential read and write mix (循序混合讀寫)
- randrw : Mixed random reads and writes. (隨機讀寫)
- trimwrite : Trim and write mix, trims preceding writes.
執行測試.
[root@localhost ~]# fio fio.cfg JOB1: (g=0): rw=read, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=4 JOB2: (g=1): rw=read, bs=32K-32K/32K-32K/32K-32K, ioengine=libaio, iodepth=4 JOB3: (g=2): rw=write, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=4 JOB4: (g=3): rw=write, bs=32K-32K/32K-32K/32K-32K, ioengine=libaio, iodepth=4 fio-2.2.8 Starting 4 processes ... Run status group 0 (all jobs): READ: io=478308KB, aggrb=47826KB/s, minb=47826KB/s, maxb=47826KB/s, mint=10001msec, maxt=10001msec Run status group 1 (all jobs): READ: io=3871.8MB, aggrb=396421KB/s, minb=396421KB/s, maxb=396421KB/s, mint=10001msec, maxt=10001msec Run status group 2 (all jobs): WRITE: io=455712KB, aggrb=45566KB/s, minb=45566KB/s, maxb=45566KB/s, mint=10001msec, maxt=10001msec Run status group 3 (all jobs): WRITE: io=1092.8MB, aggrb=111880KB/s, minb=111880KB/s, maxb=111880KB/s, mint=10001msec, maxt=10001msec Disk stats (read/write): sdb: ios=243555/148762, merge=0/0, ticks=26920/42484, in_queue=69607, util=92.90%
統計資料所代表的結果如下:
- io: Number of megabytes I/O performed.
時間內所執行的 IO 次數. - aggrb: Aggregate bandwidth of threads in the group.
平均的測試頻寬結果. - minb: Minimum average bandwidth a thread saw.
因為效能有時高有時低,所以這個值代表平均最小測試頻寬結果. - maxb: Maximum average bandwidth a thread saw.
因為效能有時高有時低,所以這個值代表平均最大測試頻寬結果. - mint: Shortest runtime of threads in the group.
因為執行時間時高有時低,所以這個值代表 threads 執行平均最短所需的時間. - maxt: Longest runtime of threads in the group.
因為執行時間時高有時低,所以這個值代表 threads 執行平均最大所需的時間.