介紹如何在 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