AIX或LINUX使用time+dd測試硬盤讀寫速度

測試硬盤   寫速度:linux

time dd if=/dev/zero of=test.dbf bs=8k count=300000
其中/dev/zero是一個僞設備,它只產生空字符流,對它不會產生IO,因此,IO都會集中在of文件中,of文件只用於寫,因此這個命令至關於測試磁盤的寫能力。

輸出的結果相似(由於通常更長測試時間更準確,因此能夠設置count大一些):
300000+0 records in
300000+0 records out

real 0m36.669s
user 0m0.185s
sys 0m9.340s

因此寫速度爲:8*300000/1024/36.669=63.916M/s數據庫

測試硬盤  讀速度:緩存

time dd if=/dev/sda1 of=/dev/null bs=8k
由於/dev/sdb1是一個物理分區,對它的讀取會產生IO,/dev/null是僞設備,至關於黑洞,of到該設備不會產生IO,
因此,這個命令的IO只發生在/dev/sdb1上,也至關於測試磁盤的讀能力

輸出的結果相似:
448494+0 records in
448494+0 records out

real 0m51.070s
user 0m0.054s
sys 0m10.028s

因此sda1上的讀取速度爲:8*448494/1024/51.070=68.61M/sbash

補充:Windows下安裝Cygwin也可使用time和dd命令,並且輸出結果中直接包含IO的時間和速度,有興趣的朋友能夠試一下,不過我測試下來的速度讀寫都只有40多M每秒,不知道是不是平臺的緣由,可能Cygwin的機制和Linux下仍是有所不一樣吧。dom


解讀dd命令

       dd命令是一個很是強大的命令,對於一些比較底層的問題,使用dd命令每每能夠獲得出人意料的效果。咱們能夠用它來測試磁盤的讀寫性能。以前一直覺得他只能測試塊設備,可是今天看到一個文章說他同時是能夠測試文件系統的(IOzone也是能夠測試文件系統跟塊設備,但IOmeter是不能用來測試文件系統的)。ssh

        而對於dd命令,咱們經常使用到的兩個設備就是 /dev/null /dev/zero 編輯器

       -------------------------------------------------------------------------------ide

       linux中特殊的設備(/dev/zeo,/dev/null,/dev/unrandom,/dev/random)性能


      /dev/zero 與 /dev/null測試

      咱們平時在使用dd命令測試磁盤性能時候,時常見到 dd if=/dev/zero或者 dd of=/dev/null這樣的寫法。這是什麼東西呢?

     /dev/null

     /dev/null看做"黑洞"。 它很是等價於一個只寫文件。全部寫入它的內容都會永遠丟失。 而嘗試從它那兒讀取內容則什麼也讀不到。因此咱們是不能從他那裏讀到數據的,因此在dd命令中當咱們爲了測試某個磁盤的讀性能時候,就能夠將of指定爲/dev/null 這樣至關從要測試的設備上讀出的數據都填到了這個無底洞中。同時, /dev/null對命令行和腳本都很是的有用的。例如,當咱們標準輸出中有不少不少的無用信息時候而咱們並不須要,這樣就能夠將輸出重定向到/dev/null中:

    禁止標準輸出.    1 cat $filename >/dev/null

    /dev/zero

     像/dev/null同樣, /dev/zero也是一個僞文件。 他產生接二連三的null的流(二進制的零流,而不是ASCII型的)。寫入它的輸出會丟失不見, 而從/dev/zero讀出一連串的null也比較困難, 雖然這也能經過od或一個十六進制編輯器來作到。 /dev/zero主要的用處是用來建立一個指定長度用於初始化的空文件,就像臨時交換文件。另外一個應用是爲特定的目的而用零去填充一個指定大小的文件,就像咱們在用dd命令爲了測試磁盤寫性能時候,咱們能夠將if指定爲/dev/zero這樣,他就至關源源不斷的向咱們要測試的設備中寫入數據。

    /dev/random與/dev/unrandom

    /dev/random和/dev/urandom是unix系統提供的產生隨機數的設備,不少應用都須要使用random設備提供的隨機數,好比ssh keys, SSL keys, TCP/IP sequence numbers等等。他們的區別在於,/dev/urandom生成的速度比/dev/random快。若是不能當即生成隨機串,/dev/random會一直阻塞,有時會很是耗費CPU;/dev/urandom則會根據其餘值當即生成一個隨機串,不會阻塞。/dev/urandom生成的隨機值沒有/dev/random隨機。大多數狀況下,咱們選用/dev/urandom

       ------------------------------------------------------------------------------

       dd有有些參數是挺難理解的,今天用了兩個小時才弄明白了設置conv=conv=fsync,oflag=sync/dsync,後二者比較好區分,前二者很差區分

咱們知道 使用dd來測試硬盤讀寫速度只能提供一個大概的測試結果,並且是連續IO 而不是隨機IO ,理論上文件規模越大,測試結果越準確。理論上bs越大,所測得性能越高

如何真正寫磁盤

        dd if=/dev/zero of=test bs=64k count=16k 這個是不許確的,由於命令結束的時候數據尚未真正寫到磁盤上去,由於對磁盤的寫,咱們通常是先寫到了緩存就返回了。

咱們來看dd的幫助頁面對於一些參數的解釋

    the FLAG 參數(完整的看手冊哦,這裏假設你是知道iflag跟oflag的)

    -dsync
   Use synchronized I/O for data. For the output file, this forces a physical write of output data on each write. For the input file, this flag can matter when reading from a remote file that    has         been written to synchronously by some other process. Metadata
    (e.g., last-access and last-modified time) is not necessarily synchronized. 

    -sync    likewise, but also for metadata

    the CONV參數
   -fsync 
      Synchronize output data and metadata just before finishing. This forces a physical write of output data and metadata

    dsync跟sync比較好理解,前者是隻同步寫數據,sync同時寫元數據

    可是感受dsync與 -fsync怎麼感受有些同樣? 網上的說法是  dd if=/dev/zero of=test bs=64k count=4k oflag=dsync 這個能夠當成是模擬數據庫插入操做,因此很慢,但仍是沒太明白。

    後來本身認真的摳了這英文用詞, conv=fsync  Synchronize output data and metadata just before finishing 意思也就是在dd命令結束前同步data和metadata,那就是否是每一次寫都同步一次咯,也就    是若是咱們在dd命令中寫了100次,他多是等到最後的時候才把他們同步到磁盤。而oflag=dsync是說Use synchronized
I/O for data. For the output file, this forces a physical write of output data on each write,注意這裏邊用詞  a physical write of output data on each write,那就是他是每一次寫都得等到這一次寫寫到了磁盤才進行下一個寫,也就是若是咱們使用dd寫100次,他每次寫都是寫到磁盤後才進行下一次寫的。因此這樣固然要比conv=fsync慢一些吧。那麼本身感受若是隻是寫一次的話,二者應該是差異不大的
,後來作了下小實驗,證明確實是這樣的。

20140723192805192.png


20140723192558296.png

在第一個圖中,咱們只寫1塊,而後使用oflag=sync與conv=fsync 測出來一個是32.1kb/s 一個是37.8kb/s 差異不大。可是下一個我寫1000個,conv=fsync就明顯的比oflag=dsync/sync快不少了,因此以爲上面本身扣的英文的理解應該是正確的。

因此在用dd作讀或者寫的時候,應該要注意本身的使用場景,若是須要將數據寫入磁盤的話

dd if=/dev/zero of=test bs=64k count=16k  是不許確的,

而 dd if=/dev/zero of=test bs=64k count=16k conv=fsync 比較準備,他在dd結束前會寫到磁盤,

而dd if=/dev/zero of=test bs=64k count=4k oflag=dsync或者sync 是真正的每寫一次就寫一次磁盤,因此其實能夠聽到磁盤啪啪啪的響的。

dd如何繞開cache

若是要規避掉文件系統cache,直接讀寫,不使用buffer cache,需作這樣的設置iflag=direct,nonblockoflag=direct,nonblockiflag=ciooflag=ciodirect 模式就是把寫入請求直接封裝成io 指令發到磁盤非direct 模式,就把數據寫入系統緩存,而後就認爲io 成功,並由操做系統決定緩存中的數據何時被寫入磁盤

相關文章
相關標籤/搜索