概念
- IOPS:Input/Output Per Second,每秒讀/寫次數,單位為次(計數)
- 延遲:是指完成一次IO請求所需的時間。延遲是關注儲存效能時最重要的指標。
- TPUT: 頻寬也叫吞吐量,每秒的讀寫資料量,單位為MB/S。
- 同步IO:同步就是在一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。當IO讀寫過程中阻塞時,使用者執行緒就會阻塞。
- 非同步IO:非同步是由核心發起讀寫,使用者執行緒只需要關注IO完成後的回撥,不需要參與到具體的IO之中,當IO讀寫阻塞時,使用者執行緒並不阻塞,在併發測試中可以轉到下一個讀寫,當IO佇列深度大於1時可以發揮併發讀寫優勢。
- 隨機IO:假設我們所需要的資料是隨機分散在磁碟的不同頁的不同扇區中的,那麼找到相應的資料需要等到磁臂(定址作用)旋轉到指定的頁,然後再尋找到對應的扇區,才能找到我們所需要的一塊資料,下次在尋找其他的資料還需要重複此過程。主要作用是針對零碎檔案(病毒掃描、啟動程式等)任務。這時我們主要關注IOPS指標。
- 順序IO:假設我們已經找到了第一塊資料,並且其他所需的資料就在這一塊資料後邊,那麼就不需要重新定址,可以依次拿到我們所需的資料。這個模式可顯示最高的吞吐量。主要是針對的大容量檔案讀寫檔案效能,這時我們主要關注頻寬指標。
- I0佇列深度:IO驅動層一次向磁碟傳遞的IO請求個數。也就是同時處理多少個IO。擁有佇列是有益的,因為佇列中的請求可以以最佳化的方式(通常是並行方式)提交給儲存子系統。
fio
- fio常用引數
filename=/dev/emcpowerb 支援檔案系統或者裸裝置,-filename=/dev/sda
direct=1 測試過程繞過機器自帶的buffer,使測試結果更真實
rw=randwread 測試隨機讀的I/O
rw=randwrite 測試隨機寫的I/O
rw=randrw 測試隨機混合寫和讀的I/O
rw=read 測試順序讀的I/O
rw=write 測試順序寫的I/O
rw=rw 測試順序混合寫和讀的I/O
bs=4k 單次io的塊檔案大小為4k
bsrange=512-2048 同上,提定資料塊的大小範圍
size=5g 本次的測試檔案大小為5g,以每次4k的io進行測試
numjobs=30 本次的測試執行緒為30
runtime=1000 測試時間為1000秒,如果不寫則一直將5g檔案分4k每次寫完為止
ioengine=psync io引擎使用pync方式(同步I),如果要使用libaio引擎, 需要yum install libaio-devel包
rwmixwrite=30 在混合讀寫的模式下,寫佔30%
group_reporting 關於顯示結果的,彙總每個程序的資訊
lockmem=1g 只使用1g記憶體進行測試
zero_buffers 用0初始化系統buffer。
nrfiles=8 每個程序生成檔案的數量。
- 磁碟讀寫常用測試點
1. Read=100% Ramdon=100% rw=randread (100%隨機讀)
2. Read=100% Sequence=100% rw=read (100%順序讀)
3. Write=100% Sequence=100% rw=write (100%順序寫)
4. Write=100% Ramdon=100% rw=randwrite (100%隨機寫)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30 (70%順序讀,30%順序寫)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30 (70%隨機讀,30%隨機寫)
- Fio輸出結果說明
io 執行了多少M的IO
bw 平均IO頻寬
iops IOPS
runt 執行緒執行時間
slat 提交延遲 (stdev指標準差)
clat 完成延遲
lat 響應時間
bw 頻寬
cpu 利用率
IO depths io佇列
IO submit 單個IO提交要提交的IO數
IO complete 與上面的提交編號類似,但用於完成。
IO issued 發出的讀/寫請求的數量,以及其中有多少是短的。
IO latencies IO完延遲的分佈
io 總共執行了多少size的IO
aggrb group總頻寬
minb 最小平均頻寬.
maxb 最大平均頻寬.
mint group中執行緒的最短執行時間.
maxt group中執行緒的最長執行時間.
ios 所有group總共執行的IO數.
merge 總共發生的IO合併數.
ticks 我們保持磁碟繁忙的ticks數。
io_queue 花費在佇列上的總共時間.
util 磁碟利用率
- 重點關注引數
IOPS: 每秒的輸入輸出量(或讀寫次數),是衡量磁碟效能的主要指標之一;
Bw: 頻寬;
slat 表示fio 提交到核心某個I/O的延遲;
clat 表示fio 核心完成某個I/O的延遲;
lat 表示從fio將請求提交給核心,再到核心完成這個I/O為止所需要的時間;
關係是 lat = slat + clat
usr:表示使用者空間程序;
sys:表示核心空間程序;
測試
-
順序讀
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest -
隨機寫
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest -
順序寫
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest -
混合隨機讀寫
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest -ioscheduler=noop
- 順序讀
bs 單次io的塊檔案大小,我們建議可以設定為資料庫的塊或頁大小,在真實的環境中或以調大size
我們需要得點關注的是IOPS :3317 以及BW IO頻寬是:13.0MiB/s
read: IOPS=3317, BW=13.0MiB/s (13.6MB/s)(2332MiB/180001msec)
fio -filename=/dev/sda1 -direct=1 -iodepth= 1 -rw=read -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k
[root@s2ahumysqlpg01 tmp]# fio -filename=/tmp/read.dat -direct=1 -iodepth 1 -rw=read -ioengine=psync -bs=4k -size=4G -numjobs=1 -runtime=180 -group_reporting -name=sqe_100read_4k
sqe_100read_4k: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
fio-3.29
Starting 1 process
sqe_100read_4k: Laying out IO file (1 file / 4096MiB)
Jobs: 1 (f=1): [R(1)][100.0%][r=8372KiB/s][r=2093 IOPS][eta 00m:00s]ta 00m:56s]
sqe_100read_4k: (groupid=0, jobs=1): err= 0: pid=5685: Fri Mar 4 17:42:10 2022
read: IOPS=3317, BW=13.0MiB/s (13.6MB/s)(2332MiB/180001msec)
clat (usec): min=209, max=535634, avg=296.20, stdev=1443.62
lat (usec): min=210, max=535635, avg=297.13, stdev=1443.62
clat percentiles (usec):
| 1.00th=[ 233], 5.00th=[ 241], 10.00th=[ 243], 20.00th=[ 247],
| 30.00th=[ 251], 40.00th=[ 253], 50.00th=[ 258], 60.00th=[ 265],
| 70.00th=[ 269], 80.00th=[ 281], 90.00th=[ 302], 95.00th=[ 330],
| 99.00th=[ 627], 99.50th=[ 1074], 99.90th=[ 4817], 99.95th=[ 9896],
| 99.99th=[34866]
bw ( KiB/s): min= 32, max=15432, per=100.00%, avg=13284.66, stdev=2559.17, samples=359
iops : min= 8, max= 3858, avg=3321.16, stdev=639.79, samples=359
lat (usec) : 250=28.88%, 500=69.77%, 750=0.58%, 1000=0.21%
lat (msec) : 2=0.36%, 4=0.08%, 10=0.06%, 20=0.03%, 50=0.02%
lat (msec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%
cpu : usr=3.56%, sys=7.57%, ctx=597121, majf=0, minf=14
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.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.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=597112,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
READ: bw=13.0MiB/s (13.6MB/s), 13.0MiB/s-13.0MiB/s (13.6MB/s-13.6MB/s), io=2332MiB (2446MB), run=180001-180001msec
- 隨機寫
-rw=randwrite ,我們啟用了50個程序模擬
我們可以看到IOPS是1108 ,BW頻寬只有 4434KiB/s
write: IOPS=1108, BW=4434KiB/s (4540kB/s)(781MiB/180331msec); 0 zone resets
# fio -filename=/tmp/write.dat -direct=1 -iodepth 1 -rw=randwrite -ioengine=psync -bs=4k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k
sqe_100write_4k: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
...
fio-3.29
Starting 50 processes
sqe_100write_4k: Laying out IO file (1 file / 4096MiB)
Jobs: 50 (f=50): [w(50)][100.0%][w=3692KiB/s][w=923 IOPS][eta 00m:00s]
sqe_100write_4k: (groupid=0, jobs=50): err= 0: pid=7128: Fri Mar 4 17:54:18 2022
write: IOPS=1108, BW=4434KiB/s (4540kB/s)(781MiB/180331msec); 0 zone resets
clat (usec): min=311, max=5969.7k, avg=45097.62, stdev=236640.38
lat (usec): min=313, max=5969.7k, avg=45098.90, stdev=236640.39
clat percentiles (usec):
| 1.00th=[ 750], 5.00th=[ 1057], 10.00th=[ 1303],
| 20.00th=[ 1647], 30.00th=[ 1844], 40.00th=[ 2343],
| 50.00th=[ 3064], 60.00th=[ 3687], 70.00th=[ 4047],
| 80.00th=[ 4948], 90.00th=[ 22938], 95.00th=[ 164627],
| 99.00th=[1283458], 99.50th=[1753220], 99.90th=[2634023],
| 99.95th=[3640656], 99.99th=[5939135]
bw ( KiB/s): min= 350, max=103337, per=100.00%, avg=7568.53, stdev=265.17, samples=10555
iops : min= 50, max=25811, avg=1887.29, stdev=66.26, samples=10555
lat (usec) : 500=0.09%, 750=0.95%, 1000=3.17%
lat (msec) : 2=29.75%, 4=34.89%, 10=18.41%, 20=2.36%, 50=2.42%
lat (msec) : 100=1.74%, 250=2.29%, 500=1.44%, 750=0.83%, 1000=0.34%
lat (msec) : 2000=1.02%, >=2000=0.30%
cpu : usr=0.03%, sys=0.15%, ctx=220103, majf=0, minf=821
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.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.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,199884,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
WRITE: bw=4434KiB/s (4540kB/s), 4434KiB/s-4434KiB/s (4540kB/s-4540kB/s), io=781MiB (819MB), run=180331-180331msec
Disk stats (read/write):
sda: ios=0/218756, merge=0/1942, ticks=0/9721312, in_queue=9809977, util=100.00%
- 隨機讀寫混合
70%隨機讀-rwmixread=70 ,30%隨機寫
從結果中我們可以看到70%隨機讀的IOPS 是1802 ,30%隨機寫是774 ,而頻寬分別是7209KiB/s,3096KiB/s。
read: IOPS=1802, BW=7209KiB/s (7382kB/s)(1268MiB/180113msec)
write: IOPS=774, BW=3096KiB/s (3171kB/s)(545MiB/180113msec); 0 zone resets
# fio -filename=/tmp/read_write.dat -direct=1 -iodepth=1 -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k
randrw_70read_4k: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
...
fio-3.29
Starting 50 processes
randrw_70read_4k: Laying out IO file (1 file / 4096MiB)
Jobs: 6 (f=6): [m(1),_(7),m(1),_(7),m(1),_(4),m(1),_(6),m(1),_(14),m(1),_(6)][2.2%][r=10.9MiB/s,w=4884KiB/s][r=2801,w=1221 IOPS][eta 02h:11m:59s]
randrw_70read_4k: (groupid=0, jobs=50): err= 0: pid=8027: Fri Mar 4 18:01:37 2022
read: IOPS=1802, BW=7209KiB/s (7382kB/s)(1268MiB/180113msec)
clat (usec): min=225, max=3503.6k, avg=18238.79, stdev=55447.72
lat (usec): min=226, max=3503.6k, avg=18239.86, stdev=55447.72
clat percentiles (usec):
| 1.00th=[ 330], 5.00th=[ 553], 10.00th=[ 635],
| 20.00th=[ 799], 30.00th=[ 1074], 40.00th=[ 1631],
| 50.00th=[ 3326], 60.00th=[ 8717], 70.00th=[ 17433],
| 80.00th=[ 28967], 90.00th=[ 47973], 95.00th=[ 69731],
| 99.00th=[ 147850], 99.50th=[ 196084], 99.90th=[ 429917],
| 99.95th=[ 859833], 99.99th=[2936013]
bw ( KiB/s): min= 350, max=25119, per=100.00%, avg=8438.00, stdev=106.40, samples=15326
iops : min= 50, max= 6272, avg=2094.52, stdev=26.64, samples=15326
write: IOPS=774, BW=3096KiB/s (3171kB/s)(545MiB/180113msec); 0 zone resets
clat (usec): min=251, max=3576.5k, avg=22074.38, stdev=134044.57
lat (usec): min=252, max=3576.5k, avg=22075.53, stdev=134044.60
clat percentiles (usec):
| 1.00th=[ 347], 5.00th=[ 537], 10.00th=[ 603],
| 20.00th=[ 709], 30.00th=[ 816], 40.00th=[ 955],
| 50.00th=[ 1188], 60.00th=[ 1565], 70.00th=[ 2311],
| 80.00th=[ 4080], 90.00th=[ 9634], 95.00th=[ 35390],
| 99.00th=[ 583009], 99.50th=[1082131], 99.90th=[1501561],
| 99.95th=[1837106], 99.99th=[3472884]
bw ( KiB/s): min= 350, max=13399, per=100.00%, avg=3753.05, stdev=51.84, samples=14762
iops : min= 50, max= 3343, avg=923.38, stdev=13.00, samples=14762
lat (usec) : 250=0.06%, 500=2.99%, 750=16.22%, 1000=12.87%
lat (msec) : 2=18.13%, 4=10.02%, 10=10.01%, 20=8.68%, 50=13.12%
lat (msec) : 100=5.06%, 250=1.98%, 500=0.44%, 750=0.11%, 1000=0.09%
lat (msec) : 2000=0.18%, >=2000=0.02%
cpu : usr=0.06%, sys=0.14%, ctx=488255, majf=0, minf=1027
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.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.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=324593,139424,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
READ: bw=7209KiB/s (7382kB/s), 7209KiB/s-7209KiB/s (7382kB/s-7382kB/s), io=1268MiB (1330MB), run=180113-180113msec
WRITE: bw=3096KiB/s (3171kB/s), 3096KiB/s-3096KiB/s (3171kB/s-3171kB/s), io=545MiB (571MB), run=180113-180113msec
Disk stats (read/write):
sda: ios=324721/139458, merge=0/2, ticks=5905787/3076202, in_queue=8984158, util=100.00%
fio結果分析
read : io=717120KB, bw=23915KB/s, iops=5978, runt= 29986msec
#這一行表示讀
#io表示執行了多少M的io,bw表示平均io頻寬,iops表示每秒的輸入輸出量,runt表示執行緒執行時間
clat (usec): min=162, max=17094, avg=1178.92, stdev=701.84
lat (usec): min=162, max=17094, avg=1179.36, stdev=702.21
clat percentiles (usec):
| 1.00th=[ 338], 5.00th=[ 462], 10.00th=[ 556], 20.00th=[ 692],
| 30.00th=[ 804], 40.00th=[ 908], 50.00th=[ 1012], 60.00th=[ 1144],
| 70.00th=[ 1304], 80.00th=[ 1528], 90.00th=[ 1960], 95.00th=[ 2384],
| 99.00th=[ 3824], 99.50th=[ 4576], 99.90th=[ 6560], 99.95th=[ 7584],
| 99.99th=[ 9920]
#io延遲包括三種:slat,clat,lat,關係是lat=slat+clat;
#slat表示fio submit某個I/O的延遲,稱slat為提交延遲;
#clat表示fio complete某個I/O的延遲,稱clat為提交延遲;
#lat表示從fio將請求提交給核心,再到核心完成這個I/O為止所需的相應時間,稱lat為響應時間;
#usec:微妙,msec:毫秒
cpu : usr=0.17%, sys=27.06%, ctx=263958, majf=0, minf=10
#usr表示使用者空間程序;
#sys表示核心空間程序;
測試過程中可以透過iostat進行監控
# iostat -d /dev/vdd -x -k 1 10
Linux 3.10.0-1160.el7.x86_64 (HLWHOST) 2024年04月24日 _x86_64_ (2 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 0.00 0.00 0.15 0.00 3.47 1.98 72.27 0.00 1.90 0.26 63.18 0.06 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 0.00 0.00 0.00 768.00 0.00 393216.00 1024.00 3.01 3.92 0.00 3.92 0.09 6.90
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 0.00 10.00 0.00 3425.00 0.00 1703940.50 995.00 10.82 3.16 0.00 3.16 0.08 28.80
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 75.00 0.00 50577.00 0.00 810672.00 0.00 32.06 6.66 0.13 0.13 0.00 0.01 75.70
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 191.00 0.00 61584.00 0.00 988688.00 0.00 32.11 8.92 0.14 0.14 0.00 0.02 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 221.00 0.00 61714.00 0.00 991904.00 0.00 32.15 8.91 0.14 0.14 0.00 0.02 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 104.00 0.00 67142.00 0.00 1076528.00 0.00 32.07 8.69 0.13 0.13 0.00 0.01 99.70
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vdd 150.00 0.00 66050.00 0.00 1059904.00 0.00 32.09 8.82 0.13 0.13 0.00 0.02 99.90
rrqms:每秒這個裝置相關的讀取請求有多少被Merge了(當系統呼叫需要讀取資料的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的資料,FS會將這個請求合併Merge)
wrqm/s:每秒這個裝置相關的寫入請求有多少被Merge了。
rsec/s:The number of sectors read from the device per second.
wsec/s:The number of sectors written to the device per second.
rKB/s:The number of kilobytes read from the device per second.
wKB/s:The number of kilobytes written to the device per second.
avgrq-sz:平均請求扇區的大小,The average size (in sectors) of the requests that were issued to the device.
avgqu-sz:是平均請求佇列的長度。毫無疑問,佇列長度越短越好,The average queue length of the requests that were issued to the device.
await:每一個IO請求的處理的平均時間(單位是微秒毫秒)。這裡可以理解為IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。這個時間包括了佇列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明佇列時間越短,反之差值越大,佇列時間越長,說明系統出了問題。
svctm:表示平均每次裝置I/O操作的服務時間(以毫秒為單位)。如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁碟效能很好。如果await的值遠高於svctm的值,則表示I/O佇列等待太長,系統上執行的應用程式將變慢。
%util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該裝置有0.8秒在處理IO,而0.2秒閒置,那麼該裝置的%util = 0.8/1 = 80%,所以該引數暗示了裝置的繁忙程度,一般地,如果該引數是100%表示磁碟裝置已經接近滿負荷執行了(當然如果是多磁碟,即使%util是100%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)。
參考和轉載
https://mp.weixin.qq.com/s/8sFFg92guraijP9C6oJ9GQ
https://blog.csdn.net/cyh183269855/article/details/73916667
https://blog.csdn.net/chongbin007/article/details/120918462
https://mp.weixin.qq.com/s/n4izPla6GhOe81AONLnreQ