IO测试工具之fio详解
目前主流的第三方IO測(cè)試工具有fio、iometer和Orion,這三種工具各有千秋。
fio在Linux系統(tǒng)下使用比較方便,iometer在window系統(tǒng)下使用比較方便,Orion是oracle的IO測(cè)試軟件,可在沒有安裝oracle數(shù)據(jù)庫的情況下模擬oracle數(shù)據(jù)庫場(chǎng)景的讀寫。
如下是在Linux系統(tǒng)上采用fio工具來對(duì)SAN存儲(chǔ)進(jìn)行的IO測(cè)試。
1、安裝fio
在fio官網(wǎng)下載fio-2.1.10.tar文件,解壓后./configure、make、make install之后就可以使用fio了。
2、fio參數(shù)解釋
可以使用fio -help查看每個(gè)參數(shù),具體的參數(shù)左右可以在官網(wǎng)查看how to文檔,如下為幾個(gè)常見的參數(shù)描述
filename=/dev/emcpowerb 支持文件系統(tǒng)或者裸設(shè)備,-filename=/dev/sda2或-filename=/dev/sdb direct=1 測(cè)試過程繞過機(jī)器自帶的buffer,使測(cè)試結(jié)果更真實(shí) rw=randwread 測(cè)試隨機(jī)讀的I/O rw=randwrite 測(cè)試隨機(jī)寫的I/O rw=randrw 測(cè)試隨機(jī)混合寫和讀的I/O rw=read 測(cè)試順序讀的I/O rw=write 測(cè)試順序?qū)懙腎/O rw=rw 測(cè)試順序混合寫和讀的I/O bs=4k 單次io的塊文件大小為4k bsrange=512-2048 同上,提定數(shù)據(jù)塊的大小范圍 size=5g 本次的測(cè)試文件大小為5g,以每次4k的io進(jìn)行測(cè)試 numjobs=30 本次的測(cè)試線程為30 runtime=1000 測(cè)試時(shí)間為1000秒,如果不寫則一直將5g文件分4k每次寫完為止 ioengine=psync io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel包 rwmixwrite=30 在混合讀寫的模式下,寫占30% group_reporting 關(guān)于顯示結(jié)果的,匯總每個(gè)進(jìn)程的信息 此外 lockmem=1g 只使用1g內(nèi)存進(jìn)行測(cè)試 zero_buffers 用0初始化系統(tǒng)buffer nrfiles=8 每個(gè)進(jìn)程生成文件的數(shù)量3、fio測(cè)試場(chǎng)景及生成報(bào)告詳解
測(cè)試場(chǎng)景:
100%隨機(jī),100%讀, 4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_4k
100%隨機(jī),100%寫, 4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k
100%順序,100%讀 ,4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k
100%順序,100%寫 ,4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k
100%隨機(jī),70%讀,30%寫 4K
fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k
結(jié)果報(bào)告查看:
[root@rac01-node02]# fio -filename=/dev/sdc4 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k_local randrw_70read_4k_local: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=psync, iodepth=1 ... fio-2.1.10 Starting 50 threads Jobs: 21 (f=21): [____m____m_m___m____mmm__mmm__mm_m_mmm_m__m__m_m_m] [3.4% done] [7004KB/2768KB/0KB /s] [1751/692/0 iops] [eta 01h:27m:00s] randrw_70read_4k_local: (groupid=0, jobs=50): err= 0: pid=13710: Wed May 31 10:23:31 2017read : io=1394.2MB, bw=7926.4KB/s, iops=1981, runt=180113msecclat (usec): min=39, max=567873, avg=24323.79, stdev=25645.98lat (usec): min=39, max=567874, avg=24324.23, stdev=25645.98clat percentiles (msec):| 1.00th=[ 3], 5.00th=[ 5], 10.00th=[ 6], 20.00th=[ 7],| 30.00th=[ 9], 40.00th=[ 12], 50.00th=[ 16], 60.00th=[ 21],| 70.00th=[ 27], 80.00th=[ 38], 90.00th=[ 56], 95.00th=[ 75],| 99.00th=[ 124], 99.50th=[ 147], 99.90th=[ 208], 99.95th=[ 235],| 99.99th=[ 314]bw (KB /s): min= 15, max= 537, per=2.00%, avg=158.68, stdev=38.08write: io=615280KB, bw=3416.8KB/s, iops=854, runt=180113msecclat (usec): min=167, max=162537, avg=2054.79, stdev=7665.24lat (usec): min=167, max=162537, avg=2055.38, stdev=7665.23clat percentiles (usec):| 1.00th=[ 201], 5.00th=[ 227], 10.00th=[ 249], 20.00th=[ 378],| 30.00th=[ 548], 40.00th=[ 692], 50.00th=[ 844], 60.00th=[ 996],| 70.00th=[ 1160], 80.00th=[ 1304], 90.00th=[ 1720], 95.00th=[ 3856],| 99.00th=[40192], 99.50th=[58624], 99.90th=[98816], 99.95th=[123392],| 99.99th=[148480]bw (KB /s): min= 6, max= 251, per=2.00%, avg=68.16, stdev=29.18lat (usec) : 50=0.01%, 100=0.03%, 250=3.15%, 500=5.00%, 750=5.09%lat (usec) : 1000=4.87%lat (msec) : 2=9.64%, 4=4.06%, 10=21.42%, 20=18.08%, 50=19.91%lat (msec) : 100=7.24%, 250=1.47%, 500=0.03%, 750=0.01%cpu : usr=0.07%, sys=0.21%, ctx=522490, majf=0, minf=7IO 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 : total=r=356911/w=153820/d=0, short=r=0/w=0/d=0latency : target=0, window=0, percentile=100.00%, depth=1Run status group 0 (all jobs):READ: io=1394.2MB, aggrb=7926KB/s, minb=7926KB/s, maxb=7926KB/s, mint=180113msec, maxt=180113msecWRITE: io=615280KB, aggrb=3416KB/s, minb=3416KB/s, maxb=3416KB/s, mint=180113msec, maxt=180113msecDisk stats (read/write):sdc: ios=356874/153927, merge=0/10, ticks=8668598/310288, in_queue=8978582, util=99.99%io=執(zhí)行了多少M(fèi)的IO
bw=平均IO帶寬
iops=IOPS
runt=線程運(yùn)行時(shí)間
slat=提交延遲
clat=完成延遲
lat=響應(yīng)時(shí)間
bw=帶寬
cpu=利用率
IO depths=io隊(duì)列
IO submit=單個(gè)IO提交要提交的IO數(shù)
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
IO latencies=IO完延遲的分布
io=總共執(zhí)行了多少size的IO
aggrb=group總帶寬
minb=最小.平均帶寬.
maxb=最大平均帶寬.
mint=group中線程的最短運(yùn)行時(shí)間.
maxt=group中線程的最長運(yùn)行時(shí)間.
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ì)列上的總共時(shí)間.
util=磁盤利用率
4、擴(kuò)展之IO隊(duì)列深度
在某個(gè)時(shí)刻,有N個(gè)inflight的IO請(qǐng)求,包括在隊(duì)列中的IO請(qǐng)求、磁盤正在處理的IO請(qǐng)求。N就是隊(duì)列深度。
加大硬盤隊(duì)列深度就是讓硬盤不斷工作,減少硬盤的空閑時(shí)間。
加大隊(duì)列深度 -> 提高利用率 -> 獲得IOPS和MBPS峰值 ->注意響應(yīng)時(shí)間在可接受的范圍內(nèi),
增加隊(duì)列深度的辦法有很多,使用異步IO,同時(shí)發(fā)起多個(gè)IO請(qǐng)求,相當(dāng)于隊(duì)列中有多個(gè)IO請(qǐng)求,多線程發(fā)起同步IO請(qǐng)求,相當(dāng)于隊(duì)列中有多個(gè)IO請(qǐng)求。
增大應(yīng)用IO大小,到達(dá)底層之后,會(huì)變成多個(gè)IO請(qǐng)求,相當(dāng)于隊(duì)列中有多個(gè)IO請(qǐng)求 隊(duì)列深度增加了。
隊(duì)列深度增加了,IO在隊(duì)列的等待時(shí)間也會(huì)增加,導(dǎo)致IO響應(yīng)時(shí)間變大,這需要權(quán)衡。
為何要對(duì)磁盤I/O進(jìn)行并行處理呢?主要目的是提升應(yīng)用程序的性能。這一點(diǎn)對(duì)于多物理磁盤組成的虛擬磁盤(或LUN)顯得尤為重要。
如果一次提交一個(gè)I/O,雖然響應(yīng)時(shí)間較短,但系統(tǒng)的吞吐量很小。
相比較而言,一次提交多個(gè)I/O既縮短了磁頭移動(dòng)距離(通過電梯算法),同時(shí)也能夠提升IOPS。
假如一部電梯一次只能搭乘一人,那么每個(gè)人一但乘上電梯,就能快速達(dá)到目的地(響應(yīng)時(shí)間),但需要耗費(fèi)較長的等待時(shí)間(隊(duì)列長度)。
因此一次向磁盤系統(tǒng)提交多個(gè)I/O能夠平衡吞吐量和整體響應(yīng)時(shí)間。
Linux系統(tǒng)查看默認(rèn)隊(duì)列深度:
[root@qsdb ~]# lsscsi -l [0:0:0:0] disk DGC VRAID 0533 /dev/sda state=running queue_depth=30 scsi_level=5 type=0 device_blocked=0 timeout=30 [0:0:1:0] disk DGC VRAID 0533 /dev/sdb state=running queue_depth=30 scsi_level=5 type=0 device_blocked=0 timeout=30 [2:0:0:0] disk DGC VRAID 0533 /dev/sdd state=running queue_depth=30 scsi_level=5 type=0 device_blocked=0 timeout=30 [2:0:1:0] disk DGC VRAID 0533 /dev/sde state=running queue_depth=30 scsi_level=5 type=0 device_blocked=0 timeout=30 [4:2:0:0] disk IBM ServeRAID M5210 4.27 /dev/sdc state=running queue_depth=256 scsi_level=6 type=0 device_blocked=0 timeout=90 [9:0:0:0] cd/dvd Lenovo SATA ODD 81Y3677 IB00 /dev/sr0 state=running queue_depth=1 scsi_level=6 type=5 device_blocked=0 timeout=30使用dd命令設(shè)置bs=2M進(jìn)行測(cè)試:
dd if=/dev/zero of=/dev/sdd bs=2M count=1000 oflag=direct記錄了1000+0 的讀入 記錄了1000+0 的寫出 2097152000字節(jié)(2.1 GB)已復(fù)制,10.6663 秒,197 MB/秒
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sdd 0.00 0.00 0.00 380.60 0.00 389734.40 1024.00 2.39 6.28 2.56 97.42可以看到2MB的IO到達(dá)底層之后,會(huì)變成多個(gè)512KB的IO,平均隊(duì)列長度為2.39,這個(gè)硬盤的利用率是97%,MBPS達(dá)到了197MB/s。
(為什么會(huì)變成512KB的IO,你可以去使用Google去查一下內(nèi)核參數(shù) max_sectors_kb的意義和使用方法 )也就是說增加隊(duì)列深度,是可以測(cè)試出硬盤的峰值的。
5、Linux系統(tǒng)中查看IO命令iostat詳解
[root@rac01-node01 /]# iostat -xd 3 Linux 3.8.13-16.2.1.el6uek.x86_64 (rac01-node01) 05/27/2017 _x86_64_ (40 CPU) Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.05 0.75 2.50 0.50 76.59 69.83 48.96 0.00 1.17 0.47 0.14 scd0 0.00 0.00 0.02 0.00 0.11 0.00 5.25 0.00 21.37 20.94 0.05 dm-0 0.00 0.00 2.40 1.24 75.88 69.83 40.00 0.01 1.38 0.38 0.14 dm-1 0.00 0.00 0.02 0.00 0.14 0.00 8.00 0.00 0.65 0.39 0.00 sdc 0.00 0.00 0.01 0.00 0.11 0.00 10.20 0.00 0.28 0.28 0.00 sdb 0.00 0.00 0.01 0.00 0.11 0.00 10.20 0.00 0.15 0.15 0.00 sdd 0.00 0.00 0.01 0.00 0.11 0.00 10.20 0.00 0.25 0.25 0.00 sde 0.00 0.00 0.01 0.00 0.11 0.00 10.20 0.00 0.14 0.14 0.00輸出參數(shù)描述:
rrqms:每秒這個(gè)設(shè)備相關(guān)的讀取請(qǐng)求有多少被Merge了(當(dāng)系統(tǒng)調(diào)用需要讀取數(shù)據(jù)的時(shí)候,VFS將請(qǐng)求發(fā)到各個(gè)FS,如果FS發(fā)現(xiàn)不同的讀取請(qǐng)求讀取的是相同Block的數(shù)據(jù),FS會(huì)將這個(gè)請(qǐng)求合并Merge) wrqm/s:每秒這個(gè)設(shè)備相關(guān)的寫入請(qǐng)求有多少被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:平均請(qǐng)求扇區(qū)的大小,The average size (in sectors) of the requests that were issued to the device. avgqu-sz:是平均請(qǐng)求隊(duì)列的長度。毫無疑問,隊(duì)列長度越短越好,The average queue length of the requests that were issued to the device. await:每一個(gè)IO請(qǐng)求的處理的平均時(shí)間(單位是微秒毫秒)。這里可以理解為IO的響應(yīng)時(shí)間,一般地系統(tǒng)IO響應(yīng)時(shí)間應(yīng)該低于5ms,如果大于10ms就比較大了。這個(gè)時(shí)間包括了隊(duì)列時(shí)間和服務(wù)時(shí)間,也就是說,一般情況下,await大于svctm,它們的差值越小,則說明隊(duì)列時(shí)間越短,反之差值越大,隊(duì)列時(shí)間越長,說明系統(tǒng)出了問題。 svctm:表示平均每次設(shè)備I/O操作的服務(wù)時(shí)間(以毫秒為單位)。如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好。
如果await的值遠(yuǎn)高于svctm的值,則表示I/O隊(duì)列等待太長,系統(tǒng)上運(yùn)行的應(yīng)用程序?qū)⒆兟?%util: 在統(tǒng)計(jì)時(shí)間內(nèi)所有處理IO時(shí)間,除以總共統(tǒng)計(jì)時(shí)間。例如,如果統(tǒng)計(jì)間隔1秒,該設(shè)備有0.8秒在處理IO,而0.2秒閑置,那么該設(shè)備的%util = 0.8/1 = 80%,
所以該參數(shù)暗示了設(shè)備的繁忙程度,一般地,如果該參數(shù)是100%表示磁盤設(shè)備已經(jīng)接近滿負(fù)荷運(yùn)行了(當(dāng)然如果是多磁盤,即使%util是100%,因?yàn)榇疟P的并發(fā)能力,所以磁盤使用未必就到了瓶頸)。
轉(zhuǎn)載于:https://www.cnblogs.com/zixia/p/9233564.html
總結(jié)
以上是生活随笔為你收集整理的IO测试工具之fio详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。