Fio壓測工具操作
fio -name=iouring_test -filename=/mnt/vdd/testfile -iodepth=128 -thread -rw=randread -ioengine=io_uring -sqthread_poll=1 -direct=1 -bs=4k -size=10G -numjobs=1 -runtime=120 -group_reporting
常用參數(shù)
[time]
runtime=time
? 告訴fio在指定的時間段后終止處理。很難確定指定作業(yè)將運(yùn)行多長時間,因此此參數(shù)可以方便的將總運(yùn)行時間限制為給定時間。當(dāng)省略單位時間,該數(shù)值以秒為單位進(jìn)行解釋。
time_based
? 如果設(shè)置,即使文件被完全讀取或?qū)懭?,fio也將在指定的運(yùn)行期間運(yùn)行。它會在runtime準(zhǔn)許時間內(nèi)多次循環(huán)相同的工作負(fù)載。
ramp_time=time
? 如果設(shè)置,fio將在記錄任何性能數(shù)據(jù)之前這段時間內(nèi)運(yùn)行指定的工作負(fù)載。有助于在記錄結(jié)果之前,讓性能穩(wěn)定下來,從而最大限度的減少穩(wěn)定結(jié)果所需的運(yùn)更新時間。請注意,ramp_time被認(rèn)為是作業(yè)的提前信息,因此如果指定了特殊的超時或者運(yùn)行時間,它將增加總運(yùn)行時間。當(dāng)省略單位時,該值以秒為單位。可以減少日志對高速IO的影響。
[I/O tpye]
direct=bool
? 是否使用 direct io
,測試過程不使用OS 自帶的buffer,使測試磁盤的結(jié)果更真實(shí)。Linux讀寫的時候,內(nèi)核維護(hù)了緩存,數(shù)據(jù)先寫到緩存,后面在后臺寫到SSD。讀的時候也優(yōu)先讀緩存里的數(shù)據(jù)。這樣速度可以加快,但是一旦掉電,緩存里的數(shù)據(jù)就沒有了。所以有一種模式叫做direct io
,跳過緩存,直接讀寫SSD。
rw=randwrite
? 測試隨機(jī)寫的I/O:
? 順序IO是指讀寫操作的訪問地址順序連接,順序的操作磁道搜索時間顯著減少,因?yàn)榇蓬^可以以最小的移動訪問下一塊?!緮?shù)據(jù)備份和日志記錄都是順序IO業(yè)務(wù)】
? 隨機(jī)IO是指讀寫操作時間連續(xù),但是訪問地址不連續(xù),隨機(jī)分布在磁盤的地址空間中。產(chǎn)生隨機(jī)IO的業(yè)務(wù)有OLTP服務(wù),SQL等。
rw=randrw
? 測試隨機(jī)寫或者讀的IO
rwmixwrite=int
? 在混合讀寫模式下,寫占用30%。
[Blocks size]
bs=int
? 單次IO的塊文件大小為16k
bsrange=1k-4k,2k-8k,1k-4k
? 指定數(shù)據(jù)塊的大小范圍,可以為讀取、寫入和修剪指定逗號分割的范圍。
size=5G
? 每個線程讀寫的數(shù)據(jù)量是5GB
[Job description]
name=str
? 一個任務(wù)的名字,重復(fù)了也沒關(guān)系。如果fio -name=job1 -name=job2,建立了兩個任務(wù),共享-name=job1之前的參數(shù)。-name=job1之后的就是job2任務(wù)獨(dú)有的參數(shù)。
numjobs=int
? 創(chuàng)建此作業(yè)的指定數(shù)量的克隆。每個作業(yè)克隆都作為一個獨(dú)立的線程或者進(jìn)程產(chǎn)生(執(zhí)行相同工作的進(jìn)程或者線程)。每個Job(任務(wù))開1個線程,有多少 -name 就開多少個線程。所以最終線程數(shù) = 任務(wù)數(shù) (-name 的數(shù)量) * numjiobs。
filename=str
? 測試文件的名稱。指定相對路徑或者絕對路徑。沒有的話會自行創(chuàng)建。
[Threads, processes and job synchronization]
thread
? Fio默認(rèn)使用fork創(chuàng)建作業(yè),如果給出此選項(xiàng),將會以pthread_create(3) 創(chuàng)建作業(yè)。使用fork創(chuàng)建線程的開銷比較大。
threads=int
? 指定線程的數(shù)量
[I/O engine]
ioengine=<str>
? str: sync 基本的同步·讀寫操作,參考fsync和fdatasync
? str:psync 基于 pread(2) 或者 pwrite(2) 進(jìn)行IO操作。
? str:vsync
? str:pvsync
? str:pvsync2:
? str:io_uring 快速的Linux原生異步I/O。支持直接和緩沖IO操作。
? str:io_uring_cmd 用于傳遞命令的快速Linux本機(jī)異步I/O。
? str:libaio linux異步I/O。注意:Linux可能只支持具有非緩沖I/O的排隊(duì)行為(設(shè)置為direct=1
或buffered=0
: rbd:通過librbd直接訪問CEPH Rados
userspace_reap:[libaio]
? 通常,在使用libaio引擎的情況下,fio將使用io_getevents(2)系統(tǒng)調(diào)用來獲取新返回的事件。打開此標(biāo)志后,將直接從客戶空間讀取AIO環(huán)以獲取事件。提高異步IO的收割速度。當(dāng)輪詢至少0個事件時候,收割模式才會啟動。(iodepth_batch_complete=0)
[IO depth]
iodepth=int
? 隊(duì)列的深度。在異步模式下,CPU不能一直無限的發(fā)命令到SSD。比如SSD執(zhí)行讀寫如果發(fā)生了卡頓,那有可能系統(tǒng)會一直不停的發(fā)命令,幾千個,甚至幾萬個,這樣一方面SSD扛不住,另一方面這么多命令會很占內(nèi)存,系統(tǒng)也要掛掉了。
iodepth 技巧
大致把延遲分為兩部分,第一部分是讀寫本身需要的時間ts,第二部分是路上的網(wǎng)絡(luò)、上下文切換時間tl。
iodepth可降低tl占比,提高ts占比:
iodepth可以批量提交請求,所以可以降低上下文切換的次數(shù)。
當(dāng)ts本身占比很高的時候,那就沒有提升的空間了。
如果ts占比較低,通過提高iodepth就可以提升iops。
[Buffers and memory]
lockmem=int
? 使用mlock(2)固定指定數(shù)量的內(nèi)存??捎糜谀M較小的內(nèi)存量。只使用指定內(nèi)存進(jìn)行測試。
zero_buffers
? 用全零初始化緩沖區(qū)。默認(rèn)值:用隨機(jī)數(shù)據(jù)填充緩沖區(qū)。
[Target file/device]
nrfiles=int
? 用于此作業(yè)文件數(shù)。默認(rèn)為1.除非文件大小明確指定大小,否則文件大小將是數(shù)據(jù)量除以nrfiles的大小。文件是為每個線程單獨(dú)創(chuàng)建的。默認(rèn)情況下,每個文件的名稱中都有一個文件編號。
opendir=str
? 讓fio遞歸的添加目錄下和子目錄下的所有文件。
[command line options]
--output=filename
? 輸出日志信息到指定的文件。
--output-format=format
? 指定輸出文件的格式。將日志格式設(shè)置為normal、terse、json 或 json+??梢赃x擇多種格式,以逗號分隔。terse 是一種基于 CSV 的格式。json+ 類似于 json,只是它添加了延遲存儲桶的完整轉(zhuǎn)儲。
[Measurements and reporting]
group_reporting
? 關(guān)于顯示結(jié)果的,匯總每個進(jìn)程的信息。
stats=bool
? 默認(rèn)情況下,fio收集并顯示所有運(yùn)行的作業(yè)的最終輸出結(jié)果。如果此選項(xiàng)設(shè)置為0,則fio將在最終統(tǒng)計(jì)輸出中忽略它。
write_bw_log=str
? 如果給定,為此作業(yè)編寫帶寬日志??梢杂糜诖鎯ψ鳂I(yè)在其生命周期內(nèi)的寬帶數(shù)據(jù)。
write_lat_log=str
? 與write_bw_log相同,只是此選項(xiàng)創(chuàng)建 I/O 提交(例如,name_slat.x.log)、完成(例如,name_clat.x.log)和總(例如,name_lat.x.log)延遲文件。有關(guān)文件名格式的詳細(xì)信息,請參閱write_bw_log,并了解數(shù)據(jù)在文件中的結(jié)構(gòu),請參閱日志文件格式。
write_hist_log=str
? 與write_bw_log相同,但改為寫入I/O完成延遲直方圖(例如 name_hist.x.log)。文章來源:http://www.zghlxwxcb.cn/news/detail-789457.html
fio壓測示例
#針對io_uring的fixedufs特性
fio -threads=8 -size=10G -name=test -group_reporting -filename=./io.tmp -runtime=60 --ioengine=io_uring --iodepth=512 --fixedbufs
#針對io_uring的sqthread_poll特性
fio -threads=8 -size=10G -name=test -group_reporting -filename=./io.tmp -runtime=60 --ioengine=io_uring --iodepth=512 --sqthread_poll 1
日志數(shù)據(jù)說明
[root@docker sda]# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -runtime=60
BS 4KB read test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
fio-3.7
Starting 1 thread
Jobs: 1 (f=1): [R(1)][100.0%][r=89.3MiB/s,w=0KiB/s][r=22.9k,w=0 IOPS][eta 00m:00s]
BS 4KB read test: (groupid=0, jobs=1): err= 0: pid=18557: Thu Apr 11 13:08:11 2019
read: IOPS=22.7k, BW=88.5MiB/s (92.8MB/s)(5313MiB/60001msec)
slat (nsec): min=901, max=168330, avg=6932.34, stdev=1348.82
clat (usec): min=90, max=63760, avg=698.08, stdev=240.83
lat (usec): min=97, max=63762, avg=705.17, stdev=240.81
clat percentiles (usec):
| 1.00th=[ 619], 5.00th=[ 627], 10.00th=[ 627], 20.00th=[ 635],
| 30.00th=[ 635], 40.00th=[ 685], 50.00th=[ 717], 60.00th=[ 725],
| 70.00th=[ 725], 80.00th=[ 725], 90.00th=[ 734], 95.00th=[ 816],
| 99.00th=[ 1004], 99.50th=[ 1020], 99.90th=[ 1057], 99.95th=[ 1057],
| 99.99th=[ 1860]
bw ( KiB/s): min=62144, max=91552, per=100.00%, avg=90669.02, stdev=3533.77, samples=120
iops : min=15536, max=22888, avg=22667.27, stdev=883.44, samples=120
lat (usec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=93.85%, 1000=5.14%
lat (msec) : 2=0.99%, 4=0.01%, 10=0.01%, 50=0.01%, 100=0.01%
cpu : usr=5.35%, sys=23.17%, ctx=1359692, majf=0, minf=17
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=1360097,0,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=88.5MiB/s (92.8MB/s), 88.5MiB/s-88.5MiB/s (92.8MB/s-92.8MB/s), io=5313MiB (5571MB), run=60001-60001msec
Disk stats (read/write):
sda: ios=1357472/0, merge=70/0, ticks=949141/0, in_queue=948776, util=99.88%
[io=執(zhí)行多少M(fèi)的IO]
參數(shù) | 內(nèi)容 |
---|---|
bw | 平均IO帶寬 |
iops | IOPS |
runt | 線程運(yùn)行時間 |
slat | 提交延遲,提交該IO請求到kernel所花的時間(不包括kernel處理的時間) |
clat | 完成延遲, 提交該IO請求到kernel后,處理所花的時間 |
lat | 響應(yīng)時間 |
bw | 帶寬 |
cpu | 利用率 |
IO depths | io隊(duì)列 |
IO submit | 單個IO提交要提交的IO數(shù) |
IO complete | Like the above submit number, but for completions instead. |
IO issued | 發(fā)出的讀寫請求數(shù)量,以及數(shù)量不足的請求 |
IO laencies | IO完成延遲的分布 |
[io=總共執(zhí)行了多少size的IO]
參數(shù) | 內(nèi)容 |
---|---|
aggrb | group總帶寬 |
minb | 最小平均帶寬 |
maxb | 最大平均帶寬 |
mint | group中線程的最短運(yùn)行時間 |
maxt | group中線程的最長運(yùn)行時間 |
ios | 所有g(shù)roup總共執(zhí)行的IO數(shù) |
merge | 總共發(fā)生的IO合并數(shù) |
ticks | Number of ticks we kept the disk busy |
io_queue | 花費(fèi)在隊(duì)列上的總共時間 |
util | 磁盤利用率 |
圖像化工具GFIO
yum install gtk2 gtk2-devel gtk2-devel-docs //安裝依賴項(xiàng)
git clone git://git.kernel.dk/fio.git
cd fio*
./configure --enable-gfio
make fio
make gfio
./fio -S
fio:server listening on 0.0.0.0, 8765 //開啟服務(wù)端
參考 link
1. fio - Flexible I/O tester rev. 3.32 — fio 3.32-43-g0ebd3-dirty documentation
(105條消息) linux FIO命令詳解(一):磁盤IO測試工具 fio (并簡要介紹iostat工具)_Yannick_J的博客-CSDN博客_fio命令
(105條消息) 【詳細(xì)齊全】FIO使用方法 及參數(shù)解析(文章末尾)_天健胡馬靈越鳥的博客-CSDN博客_fio官網(wǎng)
FIO測試工具中的iodepth具體指的是什么? - 知乎 (zhihu.com)
fio - OpenAnolis 龍蜥操作系統(tǒng)開源社區(qū)文章來源地址http://www.zghlxwxcb.cn/news/detail-789457.html
到了這里,關(guān)于Fio工具詳解【強(qiáng)大的IO性能壓測工具】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!