Fio – Flexible I/O Tester

以前用過 dd – http://benjr.tw/458, hdparm – http://benjr.tw/450 或是 Iometer – http://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 的進階使用:

沒有解決問題,試試搜尋本站其他內容

9 thoughts on “Fio – Flexible I/O Tester

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料