詳解三種Linux測試磁盤IO性能的方法總結(jié)
概述
在磁盤測試中我們一般最關(guān)心的幾個指標(biāo)分別為:iops(每秒執(zhí)行的IO次數(shù))、bw(帶寬,每秒的吞吐量)、lat(每次IO操作的延遲)。
當(dāng)每次IO操作的block較小時,如512bytes/4k/8k等,測試的主要是iops。
當(dāng)每次IO操作的block較大時,如256k/512k/1M等,測試的主要是bw。
一、dd命令
dd是linux自帶的磁盤讀寫工具,可用于測試順序讀寫。
一般而言,磁盤讀寫有兩種方式:BufferIO、DirectIO,DirectIO可以更好的了解純磁盤讀寫的性能。
1、語法
語法格式
- dd [option]
dd指令選項詳解
- if=file:輸入文件名,缺省為標(biāo)準(zhǔn)輸入
- of=file:輸出文件名,缺省為標(biāo)準(zhǔn)輸出
- ibs=bytes:一次讀入 bytes 個字節(jié)(即一個塊大小為 bytes 個字節(jié))
- obs=bytes:一次寫 bytes 個字節(jié)(即一個塊大小為 bytes 個字節(jié))
- bs=bytes:同時設(shè)置讀寫塊的大小為 bytes ,可代替 ibs 和 obs
- cbs=bytes:一次轉(zhuǎn)換 bytes 個字節(jié),即轉(zhuǎn)換緩沖區(qū)大小
- skip=blocks:從輸入文件開頭跳過 blocks 個塊后再開始復(fù)制
- seek=blocks:從輸出文件開頭跳過 blocks 個塊后再開始復(fù)制。(通常只有當(dāng)輸出文件是磁盤或磁帶時才有效)
- count=blocks:僅拷貝 blocks 個塊,塊大小等于 ibs 指定的字節(jié)數(shù)
- conv=ASCII:把EBCDIC碼轉(zhuǎn)換為ASCIl碼。
- conv=ebcdic:把ASCIl碼轉(zhuǎn)換為EBCDIC碼。
- conv=ibm:把ASCIl碼轉(zhuǎn)換為alternate EBCDIC碼。
- conv=block:把變動位轉(zhuǎn)換成固定字符。
- conv=ublock:把固定位轉(zhuǎn)換成變動位。
- conv=ucase:把字母由小寫轉(zhuǎn)換為大寫。
- conv=lcase:把字母由大寫轉(zhuǎn)換為小寫。
- conv=notrunc:不截短輸出文件。
- conv=swab:交換每一對輸入字節(jié)。
- conv=noerror:出錯時不停止處理。
- conv=sync:把每個輸入記錄的大小都調(diào)到ibs的大小(用NUL填充)。
FLAGS參數(shù)說明:
- append -append mode (makes sense only for output; conv=notrunc sug-gested)
- direct:讀寫數(shù)據(jù)采用直接IO方式;
- directory:讀寫失敗除非是directory;
- dsync:讀寫數(shù)據(jù)采用同步IO;
- sync:同上,但是針對是元數(shù)據(jù)
- fullblock:堆積滿block(accumulate full blocks of input )(iflag only);
- nonblock:讀寫數(shù)據(jù)采用非阻塞IO方式
- noatime:讀寫數(shù)據(jù)不更新訪問時間
注意:指定數(shù)字的地方若以下列字符結(jié)尾乘以相應(yīng)的數(shù)字:b=512, c=1, k=1024, w=2, xm=number m,kB=1000,K=1024,MB=1000*1000,M=1024*1024,GB=1000*1000*1000,G=1024*1024*1024
2、dd測試DirectIO
- iops——寫測試 dd if=/dev/zero of=./a.dat bs=8k count=1M oflag=direct
- iops——讀測試 dd if=./a.dat of=/dev/null bs=8k count=1M iflag=direct
- bw——寫測試 dd if=/dev/zero of=./a.dat bs=1M count=8k oflag=direct
- bw——讀測試 dd if=./a.dat of=/dev/null bs=1M count=8k iflag=direct

3、 dd測試BufferIO
BufferIO主要出現(xiàn)在一些大文件讀寫的場景,由于使用內(nèi)存做Cache所以讀寫性能上和DirectIO相比,通常會高很多,尤其是讀,所以這個場景下我們僅關(guān)心bw即可。
用dd測試BufferIO的寫時,需要增加一個conv=fdatasync,使用該參數(shù),在完成所有讀寫后會調(diào)用一個sync確保數(shù)據(jù)全部刷到磁盤上(期間操作系統(tǒng)也有可能會主動flush),否則就是主要在測內(nèi)存讀寫了;
另外還有一個參數(shù)是oflag=dsync,使用該參數(shù)也是走的BufferIO,但卻是會在每次IO操作后都執(zhí)行一個sync。
通常conv=fdatasync更符合大文件讀寫的場景,所以這里以其作為參數(shù)進(jìn)行測試。
- bw——寫測試 dd if=/dev/zero of=./a.dat bs=1M count=8k conv=fdatasync
- bw——讀測試 dd if=./a.dat of=/dev/null bs=1M count=8k

二、 fio工具
fio是專門用于測試磁盤IO的工具,與dd相比那是要強大非常多,它可以用于測試順序讀寫、隨機(jī)讀寫、順序混合讀寫、隨機(jī)混合讀寫,并且可以調(diào)整IO并發(fā)量,在測試完成后還會生成一份測試報告,相當(dāng)給力。
1、測試場景:
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
三、iozone
IOzone is a filesystem benchmark tool. The benchmark generates and measures a variety of file operations. Iozone has been ported to many machines and runs under many operating systems.
iozone是一個文件系統(tǒng)的benchmark工具,可以測試不同的操作系統(tǒng)中文件系統(tǒng)的讀寫性能。 可以測試 Read, write, re-read,re-write, read backwards, read strided, fread, fwrite, random read, pread, mmap, aio_read, aio_write 等等不同的模式下的硬盤的性能。 測試的時候請注意,設(shè)置的測試文件的大小一定要大過你的內(nèi)存(最佳為內(nèi)存的兩倍大小),不然linux會給你的讀寫的內(nèi)容進(jìn)行緩存。會使數(shù)值非常不真實。

例子:
- iozone -i 0 -i 2 -Rc -a -q 500k -g 1m -n 100k -b test_result.xls
參數(shù)說明如下:
- -i 代表測試場景,0 代表運行順序?qū)憸y試,1代表運行隨機(jī)讀寫測試。還有很多場景可選,具體可見iozone -h說明
- -R 代表生成Excel報告文件。
- -c 代表每次讀寫測試完畢都發(fā)送關(guān)閉連接的命令,主要用于測試NFS系統(tǒng)。
- -a 代表自動模式。
- -q 代表最大的記錄大小。
- -g 代表最大的文件大小。
- -n 代表最小的文件大小。
- -b 輸出的生成的Excel報告文件名字。

生成報告如下:


























