Fio使用和結果分析


感謝,參考自:https://blog.51cto.com/qixue/1906768;

官方說明文檔,很有用:https://fio.readthedocs.io/en/latest/index.html;

fio參數解釋

在此基礎上添加一些知識;

fio -filename=/dev/nvme0n1 -direct=1 -iodepth  32 -iodepth_batch 1 -iodepth_batch_complete 16 -rw=randread -ioengine=libaio -bs=16k -size=400G -numjobs=1 -runtime=600 -group_reporting -time_based -ramp_time=60 -name=nvme0 >> nvme0-4k-randread.out

參數注解(可以自行查看man文檔對比下):

  • filename:
    為該測試用例設置生成的文件名,方便各個jobs共享,如/dev/sdb;

    注意對系統盤直接測試會損壞系統分區造成無法啟動系統;可以在系統盤下創建folder來測試,並用directory指定文件夾路徑來替換掉filename;

  • directory: 測試路徑;和filename對應;

  • direct:是否使用io緩存,相當於直接io或者裸io,文件內容直接寫到磁盤設備上,不經過緩存,direct=1;

  • iodepth:隊列深度,在異步io模式模擬一次丟給系統處理的io請求數量;同步系統由於串行,一般小於1;

  • iodepth_batch:io隊列請求丟過來后,攢積到這些請求后,立即提交,默認是iodepth的值;

  • iodepth_batch_complete:io請求過來后,能retrieve獲得的最多請求數;

  • ipdepth_low:io請求達到這個水平線后,開始嘗試去補充和獲取請求,默認是iodepth的值;

-iodepth  32 -iodepth_batch 1 -iodepth_batch_complete 16

一次模擬生成32個io請求,一次處理能接受16個請求,異步模式下,1個請求來了直接提交;

libaio引擎會用這個iodepth值來調用io_setup准備個可以一次提交iodepth個IO的上下文,同時申請個io請求隊列用於保持IO。 在壓測進行的時候,系統會生成特定的IO請求,往io請求隊列里面扔,當隊列里面的IO個數達到iodepth_batch值的時候,就調用io_submit批次提交請求,然后開始調用io_getevents開始收割已經完成的IO。 每次收割多少呢?由於收割的時候,超時時間設置為0,所以有多少已完成就算多少,最多可以收割iodepth_batch_complete值個。隨着收割,IO隊列里面的IO數就少了,那么需要補充新的IO。 什么時候補充呢?當IO數目降到iodepth_low值的時候,就重新填充,保證OS可以看到至少iodepth_low數目的io在電梯口排隊着。

-iodepth=16 -iodepth_batch=8 -iodepth_low=8 -iodepth_batch_complete=8
  • rw:模擬當前的讀寫模式,模式有randread,randwrite,randrw(可以指定rwmixread或者rwmixwrite來指定比例,默認50),read,write,rw;

  • thread:fio默認會使用fork()創建job,如果這個選項設置的話,fio將使用pthread_create來創建線程;

  • ioengine:說明job處理io請求的調度方式,一般測試使用libaio(Linux native asynchronous I/O);也可以psync;

  • bs:一次io的實際塊大小;

  • size:每個job的測試大小,到這里才會結束io請求測試;

  • numjobs:同時並行運行的工作jobs數,相當於一個job克隆,具有相同workload(負載);

  • runtime:運行的時間(s); 如果不設置time_based,runtime設置的就算很大,那么io大小到size后就會立即停止,而不是到runtime設置的時間;

  • group_reporting:當設置這個值的時候,會把所有的jobs一起統計匯總平均值等信息,否則會按照每個jobs分別統計;

  • time_based: -time_based:如果設置這個值,即使io大小到達size后還未結束的情況,仍然會繼續模擬相同的負載,直至這個時間runtime結束;

  • ramp_time:ramp本意是坡度,相當於預熱,意思是跑每個job之前會跑多久的預熱,預熱時間不算進runtime;

  • name:給job起這個名字而不是使用默認的名稱;

fio結果解讀

fio -filename=/dev/vdb -direct=1 -iodepth 32 -thread -rw=randrw -rwmixread=70 -ioengine=libaio -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=testfio
testfio: (g=0): rw=randrw, bs=(R) 16.0KiB-16.0KiB, (W) 16.0KiB-16.0KiB, (T) 16.0KiB-16.0KiB, ioengine=libaio, iodepth=32
...
fio-3.7
Starting 10 threads
Jobs: 8 (f=8): [m(4),_(1),m(3),_(1),m(1)][91.9%][r=677MiB/s,w=291MiB/s][r=43.4k,w=18.6k IOPS][eta 00m:03s]
testfio: (groupid=0, jobs=10): err= 0: pid=3335: Thu Sep 24 04:25:36 2020
   read: IOPS=26.6k, BW=416MiB/s (436MB/s)(13.0GiB/34469msec)
    slat (usec): min=2, max=375533, avg=40.79, stdev=1058.36
    clat (usec): min=65, max=455661, avg=8296.62, stdev=12218.78
     lat (usec): min=76, max=455669, avg=8338.53, stdev=12297.28
    clat percentiles (usec):
     |  1.00th=[   955],  5.00th=[  1745], 10.00th=[  2245], 20.00th=[  2868],
     | 30.00th=[  3556], 40.00th=[  4228], 50.00th=[  4948], 60.00th=[  5735],
     | 70.00th=[  7177], 80.00th=[ 10159], 90.00th=[ 17957], 95.00th=[ 26608],
     | 99.00th=[ 51643], 99.50th=[ 63177], 99.90th=[147850], 99.95th=[189793],
     | 99.99th=[287310]
   bw (  KiB/s): min=  768, max=128736, per=9.86%, avg=41984.49, stdev=31169.50, samples=678
   iops        : min=   48, max= 8046, avg=2623.95, stdev=1948.09, samples=678
  write: IOPS=11.4k, BW=178MiB/s (187MB/s)(6149MiB/34469msec)
    slat (usec): min=2, max=397853, avg=44.61, stdev=1202.15
    clat (usec): min=135, max=455595, avg=8322.44, stdev=12370.30
     lat (usec): min=148, max=455605, avg=8368.17, stdev=12458.54
    clat percentiles (usec):
     |  1.00th=[   947],  5.00th=[  1762], 10.00th=[  2245], 20.00th=[  2868],
     | 30.00th=[  3556], 40.00th=[  4228], 50.00th=[  4948], 60.00th=[  5735],
     | 70.00th=[  7177], 80.00th=[ 10290], 90.00th=[ 17957], 95.00th=[ 26870],
     | 99.00th=[ 51643], 99.50th=[ 62653], 99.90th=[162530], 99.95th=[193987],
     | 99.99th=[421528]
   bw (  KiB/s): min=  288, max=53120, per=9.86%, avg=18002.25, stdev=13353.37, samples=678
   iops        : min=   18, max= 3320, avg=1125.06, stdev=834.58, samples=678
  lat (usec)   : 100=0.01%, 250=0.01%, 500=0.06%, 750=0.45%, 1000=0.62%
  lat (msec)   : 2=6.00%, 4=30.00%, 10=42.44%, 20=12.12%, 50=7.23%
  lat (msec)   : 100=0.88%, 250=0.18%, 500=0.02%
  cpu          : usr=1.74%, sys=3.50%, ctx=47684, majf=0, minf=10
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.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.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued rwts: total=917210,393510,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
   READ: bw=416MiB/s (436MB/s), 416MiB/s-416MiB/s (436MB/s-436MB/s), io=13.0GiB (15.0GB), run=34469-34469msec
  WRITE: bw=178MiB/s (187MB/s), 178MiB/s-178MiB/s (187MB/s-187MB/s), io=6149MiB (6447MB), run=34469-34469msec

Disk stats (read/write):
  vdb: ios=914415/392173, merge=0/0, ticks=5986235/2577115, in_queue=7910956, util=65.39%

witting for learning :https://www.cnblogs.com/zero-gg/p/9296603.html

IOPS: 每秒的輸入輸出量(或讀寫次數),是衡量磁盤性能的主要指標之一;

Bw: 帶寬;

slat (usec): min=2, max=397853, avg=44.61, stdev=1202.15
clat (usec): min=135, max=455595, avg=8322.44, stdev=12370.30
lat (usec): min=148, max=455605, avg=8368.17, stdev=12458.54
  • I/O延遲包括三種:slat,clat,lat:關系是 lat = slat + clat;
    • slat 表示fio submit某個I/O的延遲;
    • clat 表示fio complete某個I/O的延遲;
    • lat 表示從fio將請求提交給內核,再到內核完成這個I/O為止所需要的時間;
  lat (usec)   : 100=0.01%, 250=0.01%, 500=0.06%, 750=0.45%, 1000=0.62%
  lat (msec)   : 2=6.00%, 4=30.00%, 10=42.44%, 20=12.12%, 50=7.23%
  lat (msec)   : 100=0.88%, 250=0.18%, 500=0.02%
  • usec:微秒;msec:毫秒;1ms=1000us;
  • 這組數據表明lat(latency:延遲 )的分布;有0.01%的request延遲<100us,有0.01%的 100us < request lat < 250us,有0.06%的 250us < request lat < 500us,以此類推;
 cpu          : usr=1.74%, sys=3.50%, ctx=47684, majf=0, minf=10
  • usr:表示用戶空間進程;
  • sys:表示內核空間進程;
  • 因為上下文切換導致的主要和次要頁面失敗的用戶/系統 CPU使用百分比。因為測試被配置的使用直接IO,因此有很少的頁面失敗:;
 IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=99.9%
  • iodepth設置用來控制在任何時間有多少IO分發給系統。這完全是應用方面的,意味着它和設備的IO隊列做不同的事情,iodepth設置為1因此IO深度在100%的時間里一直是一個1;
Run status group 0 (all jobs):
   READ: bw=416MiB/s (436MB/s), 416MiB/s-416MiB/s (436MB/s-436MB/s), io=13.0GiB (15.0GB), run=34469-34469msec
  WRITE: bw=178MiB/s (187MB/s), 178MiB/s-178MiB/s (187MB/s-187MB/s), io=6149MiB (6447MB), run=34469-34469msec
  • bw=這組進程的總帶寬,每個線程的帶寬(設置了numjobs>1這里會很明顯);
  • io=這組總io大小;
  • 線程的最小和最大時間;

Util: The disk utilizatio,磁盤利用率. A value of 100% means we kept the disk busy constantly, 50% would be a disk idling half of the time;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM