fio可以用來測試磁盤IO
常用的參數如下:
filename=/dev/emcpowerb 支持文件系統或者裸設備,-filename=/dev/sda2或-filename=/dev/sdb
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方式,如果要使用libaio引擎,需要yum install libaio-devel包
rwmixwrite=30在混合讀寫的模式下,寫占30%group_reporting? ? ? ? ? 關于顯示結果的,匯總每個進程的信息
此外
lockmem=1g? ? ? ? ? ? ? 只使用1g內存進行測試
zero_buffers? ? ? ? ? ? 用0初始化系統buffer
nrfiles=8每個進程生成文件的數量
測試:
測試隨即讀:
fio -filename=/home/intellif/pandaTest -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_4k
輸出如下:
輸出結果
輸出結果的說明:
read列,io表明讀寫磁盤的數據量。bw代表磁盤的帶寬,隨即讀還是很慢的,大約5M/s(和此前自己認為的相差甚遠),iops是每秒的io數量,runt是總共花費的時間。
lat(usec),代表io的延遲,單位是納秒,250=0.02%,表示有0.02%的io花費了250ns
lat(msec0,代表延遲,單位是毫秒,2=0.24%表示有0.24的io花費了3ms,
大部分磁盤隨機讀的io在10-100ms之間。
其他的輸出,現在還不知道什么意思,以后再研究。
測試隨即寫:
fio -filename=/home/intellif/pandaTest -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k
輸出如下:
測試結果
隨即寫的話速率更低,4.4M/秒。
順序讀的測試如下:
fio -filename=/home/intellif/pandaTest -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k
輸出如下:
測試結果
順序讀達到了848M/秒!!!!沒有那么夸張吧,大部分讀只需要2ns!!!!!!!!!!!!!!!!難道用到了預讀,緩存這些???
順序寫的測試如下:
fio -filename=/home/intellif/pandaTest -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k
輸出如下:
輸出結果
順序寫的帶寬在25M/s左右,和順序讀的速率差別太大了吧。
100%隨機,70%讀,30%寫
fio -filename=/home/intellif/pandaTest -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k
輸出結果如下:
測試結果
隨機的話讀寫速度都不咋地。
io=執行了多少M的IO
bw=平均IO帶寬
iops=IOPS
runt=線程運行時間
slat=提交延遲
clat=完成延遲
lat=響應時間
bw=帶寬
cpu=利用率
IO depths=io隊列
IO submit=單個IO提交要提交的IO數
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=總共執行了多少size的IO
aggrb=group總帶寬
minb=最小.平均帶寬.
maxb=最大平均帶寬.
mint=group中線程的最短運行時間.
maxt=group中線程的最長運行時間.
ios=所有group總共執行的IO數.
merge=總共發生的IO合并數.
ticks=Number of ticks we kept the disk busy.
io_queue=花費在隊列上的總共時間.
util=磁盤利用率
4、擴展之IO隊列深度
在某個時刻,有N個inflight的IO請求,包括在隊列中的IO請求、磁盤正在處理的IO請求。N就是隊列深度。
加大硬盤隊列深度就是讓硬盤不斷工作,減少硬盤的空閑時間。
加大隊列深度 -> 提高利用率 -> 獲得IOPS和MBPS峰值 ->注意響應時間在可接受的范圍內,
增加隊列深度的辦法有很多,使用異步IO,同時發起多個IO請求,相當于隊列中有多個IO請求,多線程發起同步IO請求,相當于隊列中有多個IO請求。
增大應用IO大小,到達底層之后,會變成多個IO請求,相當于隊列中有多個IO請求 隊列深度增加了。
隊列深度增加了,IO在隊列的等待時間也會增加,導致IO響應時間變大,這需要權衡。
為何要對磁盤I/O進行并行處理呢?主要目的是提升應用程序的性能。這一點對于多物理磁盤組成的虛擬磁盤(或LUN)顯得尤為重要。
如果一次提交一個I/O,雖然響應時間較短,但系統的吞吐量很小。
相比較而言,一次提交多個I/O既縮短了磁頭移動距離(通過電梯算法),同時也能夠提升IOPS。
假如一部電梯一次只能搭乘一人,那么每個人一但乘上電梯,就能快速達到目的地(響應時間),但需要耗費較長的等待時間(隊列長度)。
因此一次向磁盤系統提交多個I/O能夠平衡吞吐量和整體響應時間。
Linux系統查看默認隊列深度:
lsscsi -l