15,584 瀏覽數

Fio – Flexible I/O Tester

以前用過 dd, hdparm 或是 Iometer 來測試 Disk I/O 的是速度,但 dd, hdparm 太過簡單,Iometer 太過老舊 ,目前看到一套 Fio – Flexible I/O Tester 的 Disk I/O 測試工具.

Fio 開發者是 Jens Axboe ?? 他是誰 !!
他是一位 Linux kernel hacker.他主責是維護 Linux 區塊層 block layer 和其他區塊設備 other block devices,為了方便他的區塊層的工作,所以他在 Linux 內核中創造了靈活的 FIO 這個可以進行效能測試 benchmarking 以及 工作負載模擬 workload simulation 的工具.FIO 之所以會受到大家重視是因為它能夠模擬不同類型的 I/O 負載,如同步,異步,MMAP…等,還可以指定 線程 threads 或進程 processes 的數量,讀與寫的混合,以及各種其他參數.

Ubuntu 直接用 apt-get install 就可以找到該相關套件.

root@ben-SDV:~# apt-get install fio
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libunity6 libindicator6 unity-2d-launcher kdebase-runtime
  linux-headers-3.2.0-25 linux-headers-3.2.0-25-generic-pae libgtkspell3-0
  libminiupnpc5 libnux-1.0-0 libnux-1.0-common librhythmbox-core4
  gir1.2-dee-0.5 linux-headers-3.2.0-25-generic libnl3 libattica0
  icc-profiles-free libindicator3-6 libnatpmp1 unity-2d-places libllvm2.9
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  libaio1 libibverbs1 librdmacm1
Suggested packages:
  gnuplot
The following NEW packages will be installed:
  fio libaio1 libibverbs1 librdmacm1
0 upgraded, 4 newly installed, 0 to remove and 80 not upgraded.
Need to get 252 kB of archives.
After this operation, 844 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
Get:1 http://tw.archive.ubuntu.com/ubuntu/ precise/main libaio1 i386 0.3.109-2ubuntu1 [6648 B]
Get:2 http://tw.archive.ubuntu.com/ubuntu/ precise/main libibverbs1 i386 1.1.5-1ubuntu1 [28.5 kB]
Get:3 http://tw.archive.ubuntu.com/ubuntu/ precise/main librdmacm1 i386 1.0.14.1-2 [19.0 kB]
Get:4 http://tw.archive.ubuntu.com/ubuntu/ precise/universe fio i386 1.59-1 [198 kB]
Get:5 http://tw.archive.ubuntu.com/ubuntu/ precise/universe fio i386 1.59-1 [198 kB]
Fetched 131 kB in 2min 17s (950 B/s)
Selecting previously unselected package libaio1.
(Reading database ... 703659 files and directories currently installed.)
Unpacking libaio1 (from .../libaio1_0.3.109-2ubuntu1_i386.deb) ...
Selecting previously unselected package libibverbs1.
Unpacking libibverbs1 (from .../libibverbs1_1.1.5-1ubuntu1_i386.deb) ...
Selecting previously unselected package librdmacm1.
Unpacking librdmacm1 (from .../librdmacm1_1.0.14.1-2_i386.deb) ...
Selecting previously unselected package fio.
Unpacking fio (from .../archives/fio_1.59-1_i386.deb) ...
Processing triggers for man-db ...
Processing triggers for doc-base ...
Processing 1 added doc-base file...
Registering documents with scrollkeeper...
Setting up libaio1 (0.3.109-2ubuntu1) ...
Setting up libibverbs1 (1.1.5-1ubuntu1) ...
Setting up librdmacm1 (1.0.14.1-2) ...
Setting up fio (1.59-1) ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place

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
    可以設定的參數如下 randrw 代表 random(隨機) 的 read(讀) write(寫),其他的請參考下面說明.
    read : Sequential reads. (循序讀)
    write : Sequential writes. (循序寫)
    randread : Random reads. (隨機讀)
    randwrite : Random writes. (隨機寫)
    rw : Mixed sequential reads and writes. (循序讀寫)
    randrw : Mixed random reads and 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
    這一測試所需的時間,單位為 秒.
  • –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] :剛剛設定的參數相同 , [dev-device] :需要待測裝置名稱.

fio 執行檔後面接設定檔即可.

#fio fio.cfg

設定檔可以幫助我們同時使用不同的測試參數,以更快的方式來測試硬碟效能,而且下次還可以沿用,更多關於設定檔的設定方式請參考 http://benjr.tw/93325

7 個網友的想法 “Fio – Flexible I/O Tester

  1. 自動參照通知: Fio (Windows 版本) | Benjr.tw

  2. 自動參照通知: Fio VS Iometer | Benjr.tw

  3. 自動參照通知: 透過FIO做各種Disk的Benchmark與Simulate各種Condition | IT水電工-哆啦胖虎

  4. 自動參照通知: Fio – Flexible I/O Tester (Job file) | Benjr.tw

  5. 自動參照通知: SAS JBOD 效能 | Benjr.tw

  6. 自動參照通知: 測試磁碟 I/O 的工具 | Benjr.tw

  7. 自動參照通知: 常用的 Performance / Monitor 測試工具 | Benjr.tw

發表迴響