以前用過 dd – https://benjr.tw/458, hdparm – https://benjr.tw/450 或是 Iometer – https://benjr.tw/370 來測試 Disk I/O 的是速度,但 dd, hdparm 太過簡單,Iometer 太過老舊 ,目前看到一套 Fio – Flexible I/O Tester 的 Disk I/O 測試工具.
Ubuntu 直接用 apt-get install 就可以找到該相關套件.
root@ben-SDV:~# apt-get install fio
CentOS/RHEL (RedHat) 需要透過 EPEL (epel-release, Extra Packages for Enterprise Linux)來安裝
[root@localhost ~]# yum install -y epel-release [root@localhost ~]# yum install -y fio
Fio 的相關參數很多,我們先來看看他提供了哪一些參數!!
http://manpages.ubuntu.com/manpages/natty/man1/fio.1.html
恩!!這麼多要從哪裡開始呢!!!
直接來看範例比較快
# fio --filename=/dev/sdb --direct=1 --rw=randrw --ioengine=libaio --bs=4k --rwmixread=100 --iodepth=16 --numjobs=16 --runtime=60 --group_reporting --name=4ktest
參數參考:
- –filename=/dev/sdb
原文寫的很怪,我這邊需要指定要測試的磁碟. - –direct=1
預設值為 0 ,必須設定為 1 才會測試到真實的 non-buffered I/O - –rw=randrw
可以設定的參數如下:- 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.
- –ioengine=libaio
定義如何跑 I/O 的方式, libaio 是 Linux 本身非同步(asynchronous) I/O 的方式.
其他還有 sync , psync , vsync , posixaio , mmap , splice , syslet-rw , sg , null , net , netsplice , cpuio , guasi , external - –bs=4k
bs 或是 blocksize ,也就是檔案寫入大小,預設值為 4K,如何設定這個值的大小,因為不同性質的儲存裝置需要不同的值.看你是 File Server,Web server , Database … 設定都會不一樣. - –rwmixread=100
當設定為 Mixed ,同一時間 read 的比例為多少,預設為 50% (50% read + 50% write) - –refill_buffers
refill_buffers 為預設值,應該是跟 I/O Buffer 有關 (refill the IO buffers on every submit),把 Buffer 填滿就不會跑到 Buffer 的值. - –iodepth=16
同一時間有多少 I/O 在做存取,越多不代表存儲裝置表現會更好,通常是 RAID 時須要設大一點. - –numjobs=16
跟前面的 iodepth 類似,但不一樣,在 Linux 下每一個 job 可以生出不同的 processes/threads ,numjobs 就是在同一個 workload 同時提出多個 I/O 請求,通常負載這個會比較大.預設值為 1. - –runtime=60
當設定為 time_based 時是以時間為單位(秒),另外一種方式是以 kb_base (kilobyte). - –group_reporting
如果 numjobs 有指定,設定 group_reporting 報告會以 per-group 的顯示方式,而不是預設的 of per-job (會顯示所有個別 numjobs 的測試結果) - –name=4ktest
代表這是一個新的測試 Job.名稱就隨你自訂了.
執行結果
4ktest: (g=0): rw=randrw, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=16 ... 4ktest: (g=0): rw=randrw, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=16 2.0.8 Starting 16 processes Jobs: 16 (f=16): [rrrrrrrrrrrrrrrr] [100.0% done] [139.5M/0K /s] [35.8K/0 iops] [eta 00m:00s] 4ktest: (groupid=0, jobs=16): err= 0: pid=4982 read : io=8469.8MB, bw=144453KB/s, iops=36113 , runt= 60040msec slat (usec): min=2 , max=99881 , avg=396.92, stdev=4518.49 clat (usec): min=3 , max=106708 , avg=6656.22, stdev=17488.79 lat (usec): min=192 , max=106732 , avg=7059.84, stdev=17945.19 clat percentiles (usec): | 1.00th=[ 286], 5.00th=[ 382], 10.00th=[ 382], 20.00th=[ 386], | 30.00th=[ 386], 40.00th=[ 386], 50.00th=[ 390], 60.00th=[ 390], | 70.00th=[ 394], 80.00th=[ 398], 90.00th=[30592], 95.00th=[60160], | 99.00th=[68096], 99.50th=[72192], 99.90th=[80384], 99.95th=[82432], | 99.99th=[86528] bw (KB/s) : min= 7776, max=10998, per=6.26%, avg=9037.62, stdev=312.92 lat (usec) : 4=0.01%, 10=0.01%, 20=0.01%, 50=0.01%, 100=0.01% lat (usec) : 250=0.38%, 500=85.62%, 750=0.19%, 1000=0.02% lat (msec) : 2=0.02%, 4=0.12%, 10=0.58%, 20=1.59%, 50=4.22% lat (msec) : 100=7.26%, 250=0.01% cpu : usr=0.60%, sys=5.24%, ctx=20755, majf=0, minf=403 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0% issued : total=r=2168242/w=0/d=0, short=r=0/w=0/d=0 Run status group 0 (all jobs): READ: io=8469.8MB, aggrb=144453KB/s, minb=144453KB/s, maxb=144453KB/s, mint=60040msec, maxt=60040msec Disk stats (read/write): sdb: ios=2164277/0, merge=0/0, ticks=71276/0, in_queue=70568, util=81.63%
怎麼檢視這一份報告呢!!
其實我看不是很懂裡面的數值,比較像是 Disk IO 效能的大概就是下面這一行.
在執行中會顯示執行結果.這大概就是他的 I/O 效能.
Jobs: 16 (f=16): [rrrrrrrrrrrrrrrr] [100.0% done] [139.5M/0K /s] [35.8K/0 iops] [eta 00m:00s]
如果要看執行結果請參考最後兩段
Run status group 0 (all jobs):
READ: io=8469.8MB, aggrb=144453KB/s, minb=144453KB/s, maxb=144453KB/s, mint=60040msec, maxt=60040msec
Disk stats (read/write):
sdb: ios=2164277/0, merge=0/0, ticks=71276/0, in_queue=70568, util=81.63%
所有的執行緒所統計所出的資料結果如下:
- io: Number of megabytes I/O performed.
全部時間下所執行的 IO 數,轉換成 Megabytes,剛剛我採用的是 4K 所以,真正的 I/O 次數是 8469.8M/4K=2168268 次. - aggrb: Aggregate bandwidth of threads in the group.
在所有的執行緒下平均合計的測試頻寬結果,所以我的硬碟執行效能為每秒 144453KB/s (約 141MBs) - 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 執行平均最大所需的時間.
Disk I/O 效能統計所代表的結果如下:
- ios: Number of I/Os performed by all groups.
這個值就是指定時間內所有的 IO 總數,如果你要算 IOPS ,請除以時間就是 IOPS,我的執行結果為 2164277 /自訂 60(秒) = 36071 IOPS
剛剛的執行結果為 ios=2164277/0 (read / write)
如果把這個值 2164277x4k 就大概是第一行的 io=8469.8MB
下面的值有機會再深入討論了.
- merge: Number of merges in the I/O scheduler.
- ticks: Number of ticks we kept the disk busy.
- io_queue: Total time spent in the disk queue.
- util: Disk utilization.
上面用於單顆硬碟的測試,當多顆硬碟時你可以直接指定 –filename=/dev/sdb:/dev/sdc (用冒號隔開) 或是寫 configuration 檔案.
# vi fio.cfg [global] direct=1 iodepth=16 ioengine=libaio #numjobs=16 blocksize=512k time_based rw=read rwmixread=100 runtime=60s group_reporting [dev-sdb] filename=/dev/sdb [dev-sdc] filename=/dev/sdc
其實就兩段 [global] : 共用的設定參數 , [job] :特別指定的參數(這邊指定待測裝置名稱).
執行 fio 後面接設定檔即可.
# fio fio.cfg
Fio 的進階使用:
- Fio Job file 設定檔,請參考 https://benjr.tw/93325
- Fio 當作硬碟的壓力測試工具,請參考 https://benjr.tw/96736
- Fio 與 Iometer 的比較,請參考 https://benjr.tw/93633
- Fio (Windows 版本),請參考 https://benjr.tw/93666
- Fio 效能測試,請參考 https://benjr.tw/269
- Fio 效能評比 SAS JBOD,請參考 https://benjr.tw/70576
9 thoughts on “Fio – Flexible I/O Tester”