正確的使用dd進行磁盤讀寫速度測試

測試方式:使用dd指令,對磁盤進行連續寫入,不使用內存緩衝區,每次寫入8k的數據,總共寫入20萬次,產生1.6G大小的文件。

測試指令:dd if=/dev/zero of=/data01/test.dbf bs=8k count=200000 conv=fdatasync

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

 

正確的使用dd進行磁盤讀寫速度測試
dd是Linux/UNIX 下的一個非常有用的命令,作用是用指定大小的塊拷貝一個文件,並在拷貝的同時進行指定的轉換,所以可以用來測試硬盤的順序讀寫能力。可以寫文件,可以寫裸設備。


dd語法
---------------------------------------------------------
功能說明:讀取,轉換並輸出數據。
語  法:dd [bs=<字節數>][cbs=<字節數>][conv=<關鍵字>][count=<區塊數>][ibs=<字節數>][if=<文件>][obs=<字節數>][of=<文件>][seek=<區塊數>][skip=<區塊數>][--help][--version]
補充說明:dd可從標準輸入或文件讀取數據,依指定的格式來轉換數據,再輸出到文件,設備或標準輸出。
參  數:
  bs=<字節數>   將ibs( 輸入)與obs(輸出)設成指定的字節數。
  cbs=<字節數>   轉換時,每次只轉換指定的字節數。
  conv=<關鍵字>   指定文件轉換的方式。
  count=<區塊數>   僅讀取指定的區塊數。
  ibs=<字節數>   每次讀取的字節數。
  if=<文件>   從文件讀取。
  obs=<字節數>   每次輸出的字節數。
  of=<文件>   輸出到文件。
  seek=<區塊數>   一開始輸出時,跳過指定的區塊數。
  skip=<區塊數>   一開始讀取時,跳過指定的區塊數。
  --help   幫助。
  --version   顯示版本信息。

dd常用參數詳解
---------------------------------------------------------
if=xxx  從xxx讀取,如if=/dev/zero,該設備無窮盡地提供0,(不產生讀磁盤IO)
of=xxx  向xxx寫出,可以寫文件,可以寫裸設備。如of=/dev/null,"黑洞",它等價於一個只寫文件. 所有寫入它的內容都會永遠丟失. (不產生寫磁盤IO)
bs=8k  每次讀或寫的大小,即一個塊的大小。
count=xxx  讀寫塊的總數量。

避免操作系統“寫緩存”干擾測試成績,使用sync、fsync、fdatasync
---------------------------------------------------------
關於sync、fsync、fdatasync請參考:http://elf8848.iteye.com/blog/2088986

dd bs=8k count=4k if=/dev/zero of=test.log conv=fsync 
dd bs=8k count=4k if=/dev/zero of=test.log conv=fdatasync
dd bs=8k count=4k if=/dev/zero of=test.log oflag=dsync
dd bs=8k count=4k if=/dev/zero of=test.log  默認“寫緩存”啓作用
dd bs=8k count=4k if=/dev/zero of=test.log conv=sync   “寫緩存”啓作用
dd bs=8k count=4k if=/dev/zero of=test.log; sync   “寫緩存”啓作用

dd bs=8k count=4k if=/dev/zero of=test.log conv=fsync 
加入這個參數後,dd命令執行到最後會真正執行一次“同步(sync)”操作,,這樣算出來的時間纔是比較符合實際使用結果的。conv=fsync表示把文件的“數據”和“metadata”都寫入磁盤(metadata包括size、訪問時間st_atime & st_mtime等等),因爲文件的數據和metadata通常存在硬盤的不同地方,因此fsync至少需要兩次IO寫操作,fsync 與fdatasync相差不大。(重要,最有參考價值)

dd bs=8k count=4k if=/dev/zero of=test.log conv=fdatasync
加入這個參數後,dd命令執行到最後會真正執行一次“同步(sync)”操作,,這樣算出來的時間纔是比較符合實際使用結果的。conv=fdatasync表示只把文件的“數據”寫入磁盤,fsync 與fdatasync相差不大。(重要,最有參考價值)

dd bs=8k count=4k if=/dev/zero of=test.log oflag=dsync
加入這個參數後,每次讀取8k後就要先把這8k寫入磁盤,然後再讀取下面一個8k,一共重複4K次。這是最慢的一種方式了。

dd bs=8k count=4k if=/dev/zero of=test
沒加關於操作系統“寫緩存”的參數,默認“寫緩存”啓作用。dd先把數據寫的操作系統“寫緩存”,就完成了寫操作。通常稱爲update的系統守護進程會週期性地(一般每隔30秒)調用sync函數,把“寫緩存”中的數據刷入磁盤。因爲“寫緩存”起作用,你會測試出一個超級快的性能。
如:163840000 bytes (164 MB) copied, 0.742906 seconds, 221 MB/s

dd bs=8k count=4k if=/dev/zero of=test conv=sync  
conv=sync參數明確“寫緩存”啓作用,默認值就是conv=sync 

dd bs=8k count=4k if=/dev/zero of=test; sync 
與第1個完全一樣,分號隔開的只是先後兩個獨立的命令。當sync命令準備開始往磁盤上真正寫入數據的時候,前面dd命令已經把錯誤的“寫入速度”值顯示在屏幕上了。所以你還是得不到真正的寫入速度。


裸設備測試
----------------------
1、裸設備到文件系統
dd if=/dev/rsd1b of=/backup/df1.dbf bs=8k skip=8 count=3841
2、文件系統到裸設備
dd if=/backup/df1.dbf of=/dev/rsd2b bs=8k seek=8
更多關於裸設備,請參考:http://czmmiao.iteye.com/blog/1748748


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章