FIO簡介
FIO是Linux下開源的一款IOPS測驗工具,主要用來對磁盤進行壓力測驗和性能驗證,
它可以產生許多執行緒或行程來執行用戶特定型別的I/O操作,通過撰寫作業檔案(類似于k8s的yaml)或者直接命令去執行測驗動作,相當于是一個 多執行緒的io生成工具,用于生成多種IO模式來測驗硬碟設備的性能(大多情況用于測驗裸盤性能),
硬碟I/O測驗主要有以下型別:
- 隨機讀、隨機寫
- 順序讀、順序寫
(fio測驗時可根據需求設定70%讀,30%寫或100%讀等等)
FIO的安裝與使用
github地址:https://github.com/axboe/fio
下載安裝方式:
$ yum -y install libaio-devel #安裝libaio引擎,不然執行fio會報“fio: engine libaio not loadable”,必須要在fio安裝前安裝,不然還要重新編譯安裝一遍fio
$ wget https://github.com/axboe/fio/archive/refs/tags/fio-3.10.zip
$ cd /root/fio-fio-3.10
$ ./configure
$ mke && make install
軟體包內也包含了最詳細的FIO官方HOWTO檔案,有興趣的可以看一看,路徑:/root/fio-fio-3.10/HOWTO
常用引數介紹
-filename=/dev/sdb #要測驗盤的名稱,支持檔案系統或者裸設備,/dev/sda2或/dev/sdb
-direct=1 #測驗程序繞過機器自帶的buffer,使測驗結果更真實(Linux在讀寫時,資料會先寫到快取,再在后臺寫到硬碟,讀的時候也是優先從快取中讀,這樣訪問速度會加快,但是一旦掉電,快取中資料就會清空,所有一種模式為DirectIO,可以跳過快取,直接讀寫硬碟)
-ioengine=libaio #定義使用什么io引擎去下發io請求,常用的一些 libaio:Linux本地異步I/O;rbd:通過librbd直接訪問CEPH Rados
-iodepth=16 #佇列的深度為16,在異步模式下,CPU不能一直無限的發命令到硬碟設備,比如SSD執行讀寫如果發生了卡頓,那有可能系統會一直不停的發命令,幾千個,甚至幾萬個,這樣一方面SSD扛不住,另一方面這么多命令會很占記憶體,系統也要掛掉了,這樣,就帶來一個引數叫做佇列深度,
-bs=4k #單次io的塊檔案大小為4k
-numjobs=10 #本次測驗的執行緒數是10
-size=5G #每個執行緒讀寫的資料量是5GB
-runtime=60 #測驗時間為60秒,可以設定2m為兩分鐘,如果不配置此項,會將設定的size大小全部寫入或者讀取完為止
-rw=randread #測驗隨機讀的I/O
-rw=randwrite #測驗隨機寫的I/O
-rw=randrw #測驗隨機混合寫和讀的I/O
-rw=read #測驗順序讀的I/O
-rw=write #測驗順序寫的I/O
-rw=rw #測驗順序混合寫和讀的I/O
-thread #使用pthread_create創建執行緒,另一種是fork創建行程,行程的開銷比執行緒要大,一般都采用thread測驗
rwmixwrite=30 #在混合讀寫的模式下,寫占30%(即rwmixread讀為70%,單獨配置這樣的一個引數即可)
-group_reporting #關于顯示結果的,匯總每個行程的資訊
-name="TDSQL_4KB_read_test" #定義測驗任務名稱
擴展
-lockmem=1g #只使用1g記憶體進行測驗
-zero_buffers #用全0初始化緩沖區,默認是用隨機資料填充緩沖區
-random_distribution=random #默認情況下,fio 會在詢問時使用完全均勻的隨機分布,有需要的話可以自定義訪問區域,zipf、pareto、normal、zoned
-nrfiles=8 #每個行程生成檔案的數量
測驗場景示例
100%隨機讀,5G大小,4k塊檔案:
fio -filename=/dev/sdb \
-direct=1 -ioengine=libaio \
-bs=4k -size=5G -numjobs=10 \
-iodepth=16 -runtime=60 \
-thread -rw=randread -group_reporting \
-name="TDSQL_4KB_randread_test"
100%順序讀,5G大小,4k塊檔案:
fio -filename=/dev/sdb \
-direct=1 -ioengine=libaio \
-bs=4k -size=5G -numjobs=10 \
-iodepth=16 -runtime=60 \
-thread -rw=read -group_reporting \
-name="TDSQL_4KB_write_test"
70%隨機讀,30%隨機寫,5G大小,4k塊檔案:
fio -filename=/dev/sdb \
-direct=1 -ioengine=libaio \
-bs=4k -size=5G -numjobs=10 \
-iodepth=16 -runtime=60 \
-thread -rw=randrw -rwmixread=70 \
-group_reporting \
-name="TDSQL_4KB_randread70-write_test"
70%順序讀,30%隨機寫,5G大小,4k塊檔案:
fio -filename=/dev/sdb \
-direct=1 -ioengine=libaio \
-bs=4k -size=5G -numjobs=10 \
-iodepth=16 -runtime=60 \
-thread -rw=rw -rwmixread=70 \
-group_reporting \
-name="TDSQL_4KB_read70-write_test"
其實重點也就在于設定合適的讀寫型別和讀寫占比就可以了
輸出報告
這里就用本地的虛擬機來簡單測驗一下了(裸盤測驗)
[root@localhost fio-fio-3.10]# fio -filename=/dev/sdb \
> -direct=1 -ioengine=libaio \
> -bs=4k -size=5G -numjobs=10 \
> -iodepth=16 -runtime=60 \
> -thread -rw=randrw -rwmixread=70 \
> -group_reporting \
> -name="local_randrw_test"
local_randrw_test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
...
fio-3.10
Starting 10 threads
Jobs: 10 (f=10): [m(10)][100.0%][r=19.4MiB/s,w=8456KiB/s][r=4969,w=2114 IOPS][eta 00m:00s]
local_randrw_test: (groupid=0, jobs=10): err= 0: pid=11189: Mon Oct 25 11:01:46 2021
read: IOPS=5230, BW=20.4MiB/s (21.4MB/s)(1226MiB/60031msec)
slat (usec): min=2, max=342637, avg=1266.82, stdev=7241.29
clat (usec): min=4, max=459544, avg=20056.81, stdev=24888.90
lat (usec): min=134, max=459586, avg=21329.16, stdev=25378.16
clat percentiles (usec):
| 1.00th=[ 1467], 5.00th=[ 1844], 10.00th=[ 2147], 20.00th=[ 2606],
| 30.00th=[ 3032], 40.00th=[ 3556], 50.00th=[ 4359], 60.00th=[ 6063],
| 70.00th=[ 36439], 80.00th=[ 46924], 90.00th=[ 51643], 95.00th=[ 59507],
| 99.00th=[105382], 99.50th=[117965], 99.90th=[137364], 99.95th=[152044],
| 99.99th=[219153]
bw ( KiB/s): min= 795, max= 4494, per=9.91%, avg=2072.23, stdev=744.04, samples=1195
iops : min= 198, max= 1123, avg=517.74, stdev=186.00, samples=1195
write: IOPS=2243, BW=8972KiB/s (9188kB/s)(526MiB/60031msec)
slat (usec): min=2, max=311932, avg=1272.76, stdev=7272.09
clat (usec): min=6, max=458031, avg=20206.30, stdev=24897.71
lat (usec): min=974, max=459755, avg=21484.12, stdev=25400.41
clat percentiles (usec):
| 1.00th=[ 1500], 5.00th=[ 1860], 10.00th=[ 2147], 20.00th=[ 2606],
| 30.00th=[ 3064], 40.00th=[ 3621], 50.00th=[ 4424], 60.00th=[ 6194],
| 70.00th=[ 36439], 80.00th=[ 46924], 90.00th=[ 51643], 95.00th=[ 59507],
| 99.00th=[105382], 99.50th=[117965], 99.90th=[137364], 99.95th=[149947],
| 99.99th=[200279]
bw ( KiB/s): min= 357, max= 1944, per=9.90%, avg=888.57, stdev=325.49, samples=1195
iops : min= 89, max= 486, avg=221.80, stdev=81.37, samples=1195
lat (usec) : 10=0.01%, 50=0.01%, 100=0.01%, 250=0.02%, 500=0.01%
lat (usec) : 750=0.01%, 1000=0.01%
lat (msec) : 2=7.45%, 4=38.36%, 10=18.10%, 20=1.09%, 50=22.31%
lat (msec) : 100=11.42%, 250=1.24%, 500=0.01%
cpu : usr=0.26%, sys=19.41%, ctx=12026, majf=0, minf=18
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 rwts: total=313975,134655,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=16
Run status group 0 (all jobs):
READ: bw=20.4MiB/s (21.4MB/s), 20.4MiB/s-20.4MiB/s (21.4MB/s-21.4MB/s), io=1226MiB (1286MB), run=60031-60031msec
WRITE: bw=8972KiB/s (9188kB/s), 8972KiB/s-8972KiB/s (9188kB/s-9188kB/s), io=526MiB (552MB), run=60031-60031msec
Disk stats (read/write):
sdb: ios=314008/134653, merge=0/0, ticks=189470/89778, in_queue=279286, util=99.75%
輸出報告分析
下面是每個執行的資料方向的I/O統計資料資訊的代表值含義
- read/write: 讀/寫的IO操作(還有一個trim沒用過)
- salt: 提交延遲,這是提交I/O所花費的時間(min:最小值,max:最大值,avg:平均值,stdev:標準偏差)
- chat: 完成延遲,表示從提交到完成I/O部分的時間
- lat: 相應時間,表示從fio創建I/O單元到完成I/O操作的時間
- bw: 帶寬統計
- iops: IOPS統計
- lat(nsec/usec/msec): I/O完成延遲的分布,這是從I/O離開fio到它完成的時間,與上面單獨的讀/寫/修剪部分不同,這里和其余部分的資料適用于報告組的所有I/ o,10=0.01%意味著0.01%的I/O在250us以下完成,250=0.02%意味著0.02%的I/O需要10到250us才能完成,
- cpu: cpu使用率
- IO depths: I/O深度在作業生命周期中的分布
- IO submit: 在一個提交呼叫中提交了多少個I/O,每一個分錄表示該數額及其以下,直到上一分錄為止——例如,4=100%意味著我們每次提交0到4個I/O呼叫
- IO complete: 和上邊的submit一樣,不過這個是完成了多少個
- IO issued rwt: 發出的read/write/trim請求的數量,以及其中有多少請求被縮短或洗掉
- IO latency: 滿足指定延遲目標所需的I/O深度
下面是Run status group 0 (all jobs) 全部任務匯總資訊的代表值含義:
- bw: 總帶寬以及最小和最大帶寬
- io: 該組中所有執行緒執行的累計I/O
- run: 這組執行緒中最小和最長的運行時,
最后是Linux中特有的磁盤狀態統計資訊的代表值含義:
- ios: 所有組的I/ o個數
- merge: I/O調度器執行的總合并數
- ticks: 使磁盤繁忙的滴答數(僅供參考,原文是Number of ticks we kept the disk busy)
- in_queue: 在磁盤佇列中花費的總時間
- util: 磁盤利用率,值為100%意味著我們保留了磁盤,如果一直很忙,那么50%的時間磁盤就會閑置一半的時間
FIO通過組態檔運行
除了命令列直接執行命令外,也可以通過寫配置到xxx.fio檔案中,每次只用修改配置即可,使用更方便些,執行方式為fio xxx.fio
[root@localhost jobs]# cat test.fio
[global]
filename=/dev/sdb
ioengine=libaio
direct=1
thread
group_reporting
[randread-4k-128M]
rw=randread
bs=4k
size=128M
numjobs=5
[randwrite-4k-128M]
rw=randwrite
bs=4k
size=128M
numjobs=5
[write-4k-128M]
rw=write
bs=4k
size=128M
numjobs=5
#執行fio命令測驗
[root@localhost jobs]# fio test.fio
randread-4k-128M: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
randwrite-4k-128M: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
write-4k-128M: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
...
fio-3.10
Starting 15 threads
Jobs: 6 (f=6): [_(3),r(1),_(1),w(5),E(1),_(4)][92.1%][r=10.8MiB/s,w=29.2MiB/s][r=2777,w=7483 IOPS][eta 00m:05s]
..........................
End……
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336222.html
標籤:其他
上一篇:wireshark域名過濾
