【LINUX】正確的使用dd進行磁碟讀寫速度測試

xysoul_雲龍發表於2017-09-27

測試方式:使用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



轉載自:http://elf8848.iteye.com/blog/2089055

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29487349/viewspace-2145473/,如需轉載,請註明出處,否則將追究法律責任。

相關文章