Categories: Linux

Linux 使用 fio 硬碟 I/O 效能測試工具教學與範例

介紹如何在 Linux 系統上使用 fio 硬碟 I/O 測試工具,測量硬碟讀取與寫入速度。

fio 是一個多功能的硬碟 I/O 測試工具,可以用來模擬各種工作型態所產生的磁碟 I/O 工作,測試各種狀況下硬碟的效能表現。

安裝 fio

若在 Ubuntu Linux 系統中,可以使用 apt 安裝 fio

# 安裝 fio 測試程式
sudo apt install fio

IOPS 測試

若要對 /dev/sdb 這一顆硬碟測試隨機讀取 IOPS 效能,可以執行:

# 測試隨機讀取 IOPS
sudo fio --filename=/dev/sdb --direct=1 --rw=randread \
    --bs=4k --ioengine=libaio --iodepth=256 --runtime=120 \
    --numjobs=4 --time_based --group_reporting \
    --name=iops-test-job --eta-newline=1 --readonly

在執行測試之後,fio 會輸出類似這樣的報表:

iops-test-job: (groupid=0, jobs=4): err= 0: pid=398975: Thu Sep 22 09:47:43 2022
  read: IOPS=22.1k, BW=86.3MiB/s (90.5MB/s)(10.1GiB/120151msec)
    slat (nsec): min=1985, max=32984k, avg=179279.76, stdev=566288.21
    clat (usec): min=1630, max=1388.5k, avg=46157.50, stdev=20710.12
     lat (usec): min=1635, max=1389.4k, avg=46336.92, stdev=20728.10
    clat percentiles (msec):
     |  1.00th=[   27],  5.00th=[   31], 10.00th=[   33], 20.00th=[   36],
     | 30.00th=[   38], 40.00th=[   40], 50.00th=[   43], 60.00th=[   45],
     | 70.00th=[   48], 80.00th=[   53], 90.00th=[   62], 95.00th=[   71],
     | 99.00th=[  125], 99.50th=[  169], 99.90th=[  275], 99.95th=[  326],
     | 99.99th=[  481]
   bw (  KiB/s): min=61176, max=111824, per=100.00%, avg=88429.55, stdev=2469.65, samples=960
   iops        : min=15294, max=27956, avg=22107.33, stdev=617.42, samples=960
  lat (msec)   : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.04%, 50=74.83%
  lat (msec)   : 100=23.54%, 250=1.43%, 500=0.14%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2000=0.01%
  cpu          : usr=0.82%, sys=2.32%, ctx=511251, majf=0, minf=1072
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.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.0%, 32=0.0%, 64=0.0%, >=64=0.1%
     issued rwts: total=2654281,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=256

Run status group 0 (all jobs):
   READ: bw=86.3MiB/s (90.5MB/s), 86.3MiB/s-86.3MiB/s (90.5MB/s-90.5MB/s), io=10.1GiB (10.9GB), run=120151-120151msec

Disk stats (read/write):
  vdb: ios=2654267/4, merge=7/0, ticks=30323121/1, in_queue=25044372, util=99.98%

fio 支援的參數選項相當多,我們也可以將參數設定寫成一個設定檔,以設定檔的方式執行 fio,以上面的例子來說,可以將參數寫成以下這樣的設定檔:

[global]
bs=4K
iodepth=256
direct=1
ioengine=libaio
group_reporting
time_based
runtime=120
numjobs=4
name=raw-randread
rw=randread

[job1]
filename=/dev/sdb

將此設定檔儲存為 myconfig.fio,接著讓 fio 讀取此設定檔進行測試:

# 搭配設定檔執行 fio
fio randomread.fio

若要對 /mnt/data/myfile 這一個檔案進行隨機的讀取與寫入的 IOPS 測試,可以執行:

# 測試隨機讀取與寫入檔案的 IOPS
sudo fio --filename=/mnt/data/myfile --size=500GB --direct=1 \
    --rw=randrw --bs=4k --ioengine=libaio --iodepth=256 \
    --runtime=120 --numjobs=4 --time_based \
    --group_reporting --name=iops-test-job --eta-newline=1

若要對 /dev/sdb 這一顆硬碟測試隨機的讀取與寫入的 IOPS 效能,可以執行:

# 測試隨機讀寫硬碟的 IOPS
sudo fio --filename=/dev/sdb --direct=1 --rw=randrw \
    --bs=4k --ioengine=libaio --iodepth=256 --runtime=120 \
    --numjobs=4 --time_based --group_reporting \
    --name=iops-test-job --eta-newline=1
隨機寫入硬碟會造成硬碟上的資料損毀,請勿在有資料的硬碟上進行隨機寫入測試。

若要對 /dev/sdb 這一顆硬碟測試循序讀取的 IOPS 效能,可以執行:

# 測試循序讀取硬碟的 IOPS
sudo fio --filename=/dev/sdb --direct=1 --rw=read \
    --bs=4k --ioengine=libaio --iodepth=256 --runtime=120 \
    --numjobs=4 --time_based --group_reporting \
    --name=iops-test-job --eta-newline=1 --readonly

吞吐量(Throughput)測試

若要對 /dev/sdb 這一顆硬碟測試隨機讀取的吞吐量,可以執行:

# 測試隨機讀取吞吐量
sudo fio --filename=/dev/sdb --direct=1 --rw=randread \
    --bs=64k --ioengine=libaio --iodepth=64 --runtime=120 \
    --numjobs=4 --time_based --group_reporting \
    --name=throughput-test-job --eta-newline=1 --readonly

若要對 /mnt/data/myfile 這一個檔案進行隨機的讀取與寫入的吞吐量測試,可以執行:

# 測試隨機讀取與寫入檔案的吞吐量
sudo fio --filename=/mnt/data/myfile --size=500GB --direct=1 \
    --rw=randrw --bs=64k --ioengine=libaio --iodepth=64 \
    --runtime=120 --numjobs=4 --time_based --group_reporting \
    --name=throughput-test-job --eta-newline=1

若要對 /dev/sdb 這一顆硬碟測試隨機的讀取與寫入的吞吐量,可以執行:

# 測試隨機讀寫硬碟的吞吐量
sudo fio --filename=/dev/sdb --direct=1 --rw=randrw \
    --bs=64k --ioengine=libaio --iodepth=64 --runtime=120 \
    --numjobs=4 --time_based --group_reporting \
    --name=throughput-test-job --eta-newline=1

若要對 /dev/sdb 這一顆硬碟測試循序讀取的吞吐量,可以執行:

# 測試循序讀取硬碟的吞吐量
sudo fio --filename=/dev/sdb --direct=1 --rw=read \
    --bs=64k --ioengine=libaio --iodepth=64 --runtime=120 \
    --numjobs=4 --time_based --group_reporting \
    --name=throughput-test-job --eta-newline=1 --readonly

延遲(Latency)測試

若要對 /dev/sdb 這一顆硬碟測試隨機讀取的延遲,可以執行:

# 測試隨機讀取的延遲
sudo fio --filename=device name --direct=1 --rw=randread \
    --bs=4k --ioengine=libaio --iodepth=1 --numjobs=1 \
    --time_based --group_reporting --name=readlatency-test-job \
    --runtime=120 --eta-newline=1 --readonly

若要對 /dev/sdb 這一顆硬碟測試隨機的讀取與寫入的延遲,可以執行:

# 測試隨機讀寫硬碟的延遲
sudo fio --filename=/dev/sdb --direct=1 --rw=randrw \
    --bs=4k --ioengine=libaio --iodepth=1 --numjobs=1 \
    --time_based --group_reporting --name=rwlatency-test-job \
    --runtime=120 --eta-newline=1

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago