dd其實(shí)是工作于比較低層的一個(gè)數(shù)據(jù)拷貝和轉(zhuǎn)換的*nix平臺(tái)的工具,但是因?yàn)閐d命令支持*nix平臺(tái)的一些特殊設(shè)備,因此我們可以利用dd命令的這個(gè)特性來簡單的測試磁盤的性能。
dd命令
先說一下兩個(gè)相關(guān)的特殊設(shè)備
/dev/null
空設(shè)備,通常用作輸出設(shè)備,這個(gè)是*nix系統(tǒng)上面的黑洞,所有送到這個(gè)空設(shè)備上的內(nèi)容都會(huì)憑空消失。
/dev/zero
空字符,通常用作輸入,從/dev/zero中讀取時(shí),它能源源不斷的提供空字符(ASCII NUL, 0×00)出來,要多少有多少。
于是就有了下面的用法:
測試磁盤的寫入:/usr/bin/time dd if=/dev/zero of=/tmp/foo bs=4k count=1024000
這個(gè)命令時(shí)往磁盤的文件/tmp/foo中寫入一個(gè)4G大小的文件,當(dāng)然文件的內(nèi)容全部是空字符了,同時(shí)用/usr/bin/time來對命令的執(zhí)行進(jìn)行計(jì)時(shí),命令中的bs指的是寫入文件時(shí)的塊大小,其實(shí)就相當(dāng)于Oracle中的block大小了,count是寫入的塊數(shù)。采取這種方法來寫入數(shù)據(jù)時(shí)只是測試的連續(xù)讀磁盤的性能,而不是隨機(jī)讀的性能,不能采取這種方法檢查一個(gè)機(jī)器的IOPS的,只能檢查磁盤的吞吐率。
測試磁盤的讀?。?usr/bin/time dd if=/tmp/foo of=/dev/null bs=4k
上面的命令是從/tmp/foo文件中讀取數(shù)據(jù),然后扔掉,這里bs用的是讀取時(shí)塊的大小。和上面寫入的命令一樣,這樣測試的僅僅是最大的讀取性能,而不是隨機(jī)IO的性能。
還能讀寫同時(shí)測試:/usr/bin/time dd if=/tmp/foo of=/tmp/foo2 bs=4k
在上面的命令中都用到了time命令對操作進(jìn)行計(jì)時(shí),這樣才能正確的進(jìn)行判斷。要記住的一點(diǎn)是dd命令只能夠提供一個(gè)大概的測試,通過這個(gè)簡單的命令可以對磁盤系統(tǒng)的最大性能有一個(gè)大概的了解,要了解更詳細(xì)的信息還要通過其他方法來查看。
理解iostat的各項(xiàng)輸出
在Linux中,我們執(zhí)行一個(gè)iostat -x命令,我們能看到如下的輸出
$iostat -x
Linux 2.4.21-50a6smp (linux) 11/03/2009
avg-cpu: %user %nice %sys %iowait %idle
0.42 0.00 0.26 0.47 98.86
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
hdc 0.01 0.00 0.00 0.00 0.07 0.00 0.03 0.00 24.48 0.00 4.90 4.57 0.00
hda 0.89 8.54 0.74 4.49 12.60 104.22 6.30 52.11 22.32 0.03 5.41 1.01 0.53
我們先列舉一下各個(gè)性能指標(biāo)的簡單說明。
rrqm/s:每秒進(jìn)行merge的讀操作數(shù)目。
wrqm/s:每秒進(jìn)行merge的寫操作數(shù)目。
r/s:每秒完成的讀I/O設(shè)備次數(shù)。
w/s:每秒完成的寫I/O設(shè)備次數(shù)。
rsec/s:每秒讀扇區(qū)數(shù)。
wsec/s:每秒寫扇區(qū)數(shù)。
rkB/s:每秒讀K字節(jié)數(shù)。
wkB/s:每秒寫K字節(jié)數(shù)。
avgrq-sz:平均每次設(shè)備I/O操作的數(shù)據(jù)大?。ㄉ葏^(qū))。
avgqu-sz:平均I/O隊(duì)列長度。
await:平均每次設(shè)備I/O操作的等待時(shí)間(毫秒)。
svctm:平均每次設(shè)備I/O操作的服務(wù)時(shí)間(毫秒)。
%util:一秒中有百分之多少的時(shí)間用于I/O操作,或者說一秒中有多少時(shí)間I/O隊(duì)列是非空的。
IO的執(zhí)行過程的各個(gè)參數(shù)
上圖的左邊是iostat顯示的各個(gè)性能指標(biāo),每個(gè)性能指標(biāo)都會(huì)顯示在一條虛線之上,這表明這個(gè)性能指標(biāo)是從虛線之上的那個(gè)讀寫階段開始計(jì)量的,比如說圖中的w/s從Linux IO scheduler開始穿過硬盤控制器(CCIS/3ware),這就表明w/s統(tǒng)計(jì)的是每秒鐘從Linux IO scheduler通過硬盤控制器的寫IO的數(shù)量。
結(jié)合上圖對讀IO操作的過程做一個(gè)說明,在從OS Buffer Cache傳入到OS Kernel(Linux IO scheduler)的讀IO操作的個(gè)數(shù)實(shí)際上是rrqm/s+r/s,直到讀IO請求到達(dá)OS Kernel層之后,有每秒鐘有rrqm/s個(gè)讀IO操作被合并,最終轉(zhuǎn)送給磁盤控制器的每秒鐘讀IO的個(gè)數(shù)為r/w;在進(jìn)入到操作系統(tǒng)的設(shè)備層(/dev/sda)之后,計(jì)數(shù)器開始對IO操作進(jìn)行計(jì)時(shí),最終的計(jì)算結(jié)果表現(xiàn)是await,這個(gè)值就是我們要的IO響應(yīng)時(shí)間了;svctm是在IO操作進(jìn)入到磁盤控制器之后直到磁盤控制器返回結(jié)果所花費(fèi)的時(shí)間,這是一個(gè)實(shí)際IO操作所花的時(shí)間,當(dāng)await與svctm相差很大的時(shí)候,我們就要注意磁盤的IO性能了;而avgrq-sz是從OS Kernel往下傳遞請求時(shí)單個(gè)IO的大小,avgqu-sz則是在OS Kernel中IO請求隊(duì)列的平均大小。
現(xiàn)在我們可以將iostat輸出結(jié)果和我們前面討論的指標(biāo)掛鉤了。
平均單次IO大小(IO Chunk Size) <=> avgrq-sz
平均IO響應(yīng)時(shí)間(IO Response Time) <=> await
IOPS(IO per Second) <=> r/s + w/s
吞吐率(Throughtput) <=> rkB/s + wkB/s
topiostat的應(yīng)用實(shí)例
觀察IO Scheduler的IO合并(IO Merge)
前面說過IO在執(zhí)行過程中會(huì)被合并以提高效率,下面就結(jié)合dd命令和iostat命令看一下。
我們先執(zhí)行dd命令,設(shè)置bs參數(shù)值為1k,完整命令如下
dd if=/dev/zero of=test bs=1k count=1024000
同時(shí)打開另外一個(gè)終端執(zhí)行iostat命令,這里只查看變化那個(gè)磁盤的更改,每秒刷新一次數(shù)據(jù),完整命令如下
iostat -x hdc7 1
然后我們可以得到下面的結(jié)果
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
hdc7 0.00 9447.00 0.00 776.00 0.00 80616.00 0.00 40308.00 103.89 480.18 805.95 1.29 100.00
avg-cpu: %user %nice %sys %iowait %idle
0.50 0.00 56.00 43.50 0.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
hdc7 0.00 9534.00 0.00 872.00 0.00 81384.00 0.00 40692.00 93.33 274.56 401.19 1.14 99.00
avg-cpu: %user %nice %sys %iowait %idle
2.50 0.00 46.50 14.00 37.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
hdc7 0.00 6766.00 1.00 276.00 8.00 58808.00 4.00 29404.00 212.33 197.27 321.66 1.95 54.00
avg-cpu: %user %nice %sys %iowait %idle
0.50 0.00 0.50 0.00 99.00
看結(jié)果中第一組數(shù)據(jù)中的avgrq-sz,為103.89個(gè)扇區(qū),磁盤的每個(gè)扇區(qū)為512字節(jié),因此平均IO大小為103.89*512/1024=52k字節(jié),遠(yuǎn)遠(yuǎn)大于我們dd命令時(shí)給定的參數(shù)1k字節(jié),也就是說IO在中間被合并了。看巨大的wrqm/s也能得出同樣的結(jié)論。
附:在windows中監(jiān)視IO性能
本來準(zhǔn)備寫一篇windows中監(jiān)視IO性能的,后來發(fā)現(xiàn)好像可寫的內(nèi)容不多,windows在細(xì)節(jié)這方面做的不是那么的好,不過那些基本信息還是有的。
在Windows中監(jiān)視性能基本都用性能監(jiān)視器了,與IO性能相關(guān)的有兩個(gè)大類,一個(gè)是”LogicalDisk”,另外一個(gè)是”PhysicalDisk”,”LogicalDisk”更多的是用來監(jiān)視文件相關(guān)的IO性能,而”PhysicalDisk”則是用來監(jiān)視LUN或者是磁盤卷,下面就列舉下與前面所列舉的IO性能相關(guān)的計(jì)數(shù)器,具體的自己研究了:
單次IO大小
?Avg. Disk Bytes/Read
?Avg. Disk Bytes/Write
IO響應(yīng)時(shí)間
?Avg. Disk sec/Read
?Avg. Disk sec/Write
IOPS
?Disk Reads/sec
?Disk Writes/sec
?Disk Transfers/sec
IO吞吐率
?Disk Bytes/sec
?Disk Read Bytes/sec
?Disk Write Bytes/sec
評論
查看更多