命令:time dd if=/dev/zero bs=1M count=2048 of= 此命令為在當前目錄下新建一個2G的文件
Demo如下:
寫速度:
time dd if=/dev/zero of=test.dbf bs=8k count=
其中/dev/zero是一個偽設(shè)備,它只產(chǎn)生空字符流,對它不會產(chǎn)生IO,所以,IO都會集中在of文件中磁盤讀寫請求比例趨勢,of文件只用于寫,所以這個命令相當于測試磁盤的寫能力。
輸出的結(jié)果類似(因為一般更長測試時間更準確,所以可以設(shè)置count大一些):
+0 in
+0 out
real 0m36.669s
user 0m0.185s
sys 0m9.340s
所以寫速度為:8*/1024/36.669=63.916M/s
讀速度:
time dd if=/dev/sda1 of=/dev/null bs=8k
因為/dev/sdb1是一個物理分區(qū),對它的讀取會產(chǎn)生IO,/dev/null是偽設(shè)備,相當于黑洞,of到該設(shè)備不會產(chǎn)生IO,所以,這個命令的IO只發(fā)生在/dev/sdb1上磁盤讀寫請求比例趨勢,也相當于測試磁盤的讀能力
輸出的結(jié)果類似:
+0 in
+0 out
real 0m51.070s
user 0m0.054s
sys 0m10.028s
所以sda1上的讀取速度為:8*/1024/51.070=68.61M/s
============================================================================================
dd
dd命令是一個非常強大的命令,對于一些比較底層的問題,使用dd命令往往可以得到出人意料的效果。我們可以用它來測試磁盤的讀寫性能。
而對于dd命令,我們常用到的兩個設(shè)備就是 /dev/null /dev/zero ,特殊設(shè)備 見這里說明:
dd有有些參數(shù)是挺難理解的,今天用了兩個小時才弄明白了設(shè)置conv=conv=fsync,oflag=sync/dsync,后兩者比較好區(qū)分,前兩者不好區(qū)分
我們知道使用dd來測試硬盤讀寫速度只能提供一個大概的測試結(jié)果,而且是連續(xù)IO 而不是隨機IO ,理論上文件規(guī)模越大,測試結(jié)果越準確。理論上bs越大,所測得性能越高
如何真正寫磁盤
dd if=/dev/zero of=test bs=64k count=16k這個是不準確的,因為命令結(jié)束的時候數(shù)據(jù)還沒有真正寫到磁盤上去,因為對磁盤的寫,我們一般是先寫到了緩存就返回了。
我們來看dd的幫助頁面對于一些參數(shù)的解釋
the FLAG 參數(shù)(完整的看手冊哦,這里假設(shè)你是知道iflag跟oflag的)
-dsync
Use I/O for data. For the file, this a write of data on each write. For the input file, this flag can when from a file that has been to by some other .
(e.g., last- and last- time) is not .
-sync , but also for
the CONV參數(shù)
-fsync
data and just . This a write of data and
dsync跟sync比較好理解,前者是只同步寫數(shù)據(jù),sync同時寫元數(shù)據(jù)
但是感覺dsync與 -fsync怎么感覺有些一樣? 網(wǎng)上的說法是dd if=/dev/zero of=test bs=64k count=4k oflag=dsync這個可以當成是模擬數(shù)據(jù)庫插入操作,所以很慢,但還是沒太明白。
后來自己認真的摳了這英文用詞,conv=fsync data and just 意思也就是在dd命令結(jié)束前同步data和,那就是不是每一次寫都同步一次咯,也就是如果我們在dd命令中寫了100次,他可能是等到最后的時候才把他們同步到磁盤。而oflag=dsync是說Use
I/O for data. For the file, this a write of data on each write,注意這里邊用詞a write of data on each write,那就是他是每一次寫都得等到這一次寫寫到了磁盤才進行下一個寫,也就是如果我們使用dd寫100次,他每次寫都是寫到磁盤后才進行下一次寫的。所以這樣當然要比conv=fsync慢一些吧。那么自己感覺如果只是寫一次的話,兩者應(yīng)該是差別不大的,后來做了下小實驗,證實確實是這樣的。
在第一個圖中,我們只寫1塊,然后使用oflag=sync與conv=fsync 測出來一個是32.1kb/s 一個是37.8kb/s 差別不大。但是下一個我寫1000個,conv=fsync就明顯的比oflag=dsync/sync快很多了,所以覺得上面自己扣的英文的理解應(yīng)該是正確的。
所以在用dd做讀或者寫的時候,應(yīng)該要注意自己的使用場景,如果需要將數(shù)據(jù)寫入磁盤的話
dd if=/dev/zero of=test bs=64k count=16k 是不準確的,
而dd if=/dev/zero of=test bs=64k count=16k conv=fsync 比較準備,他在dd結(jié)束前會寫到磁盤,
而dd if=/dev/zero of=test bs=64k count=4k oflag=dsync或者sync 是真正的每寫一次就寫一次磁盤,所以其實可以聽到磁盤啪啪啪的響的。
dd如何繞開cache
如果要規(guī)避掉文件系統(tǒng)cache,直接讀寫,不使用 cache,需做這樣的設(shè)置
iflag=,
oflag=,
iflag=cio
oflag=cio
模式就是把寫入請求直接封裝成io 指令發(fā)到磁盤
非 模式,就把數(shù)據(jù)寫入系統(tǒng)緩存,然后就認為io 成功,并由操作系統(tǒng)決定緩存中的數(shù)據(jù)什么時候被寫入磁盤