dd 是 Linux/UNIX 下的一個很是有用的命令,做用是用指定大小的塊拷貝一個文件,並在拷貝的同時進行指定的轉換。html
dd 命令通用語法格式以下:ios
dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks
if=file 輸入文件名,缺省爲標準輸入。 of=file 輸出文件名,缺省爲標準輸出。 ibs=bytes 一次讀入 bytes 個字節(即一個塊大小爲 bytes 個字節)。 obs=bytes 一次寫 bytes 個字節(即一個塊大小爲 bytes 個字節)。 bs=bytes 同時設置讀寫塊的大小爲 bytes ,可代替 ibs 和 obs 。 cbs=bytes 一次轉換 bytes 個字節,即轉換緩衝區大小。 skip=blocks 從輸入文件開頭跳過 blocks 個塊後再開始複製。 seek=blocks 從輸出文件開頭跳過 blocks 個塊後再開始複製。(一般只有當輸出文件是磁盤或磁帶時纔有效)。 count=blocks 僅拷貝 blocks 個塊,塊大小等於 ibs 指定的字節數。 conv=conversion[,conversion...] 用指定的參數轉換文件。 iflag=FLAGS 指定讀的方式FLAGS,參見「FLAGS參數說明」 oflag=FLAGS 指定寫的方式FLAGS,參見「FLAGS參數說明」
conv 轉換參數:緩存
ascii 轉換 EBCDIC 爲 ASCII。 ebcdic 轉換 ASCII 爲 EBCDIC。 ibm 轉換 ASCII 爲 alternate EBCDIC. block 把每一行轉換爲長度爲 cbs 的記錄,不足部分用空格填充。 unblock 使每一行的長度都爲 cbs ,不足部分用空格填充。 lcase 把大寫字符轉換爲小寫字符。 ucase 把小寫字符轉換爲大寫字符。 swab 交換輸入的每對字節。 noerror 出錯時不中止。 notrunc 不截短輸出文件。 sync 把每一個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊。
FLAGS 參數說明:app
append -append mode (makes sense only for output; conv=notrunc sug-gested) direct 讀寫數據採用直接IO方式; directory 讀寫失敗除非是directory; dsync 讀寫數據採用同步IO; sync 同上,可是針對是元數據 fullblock 堆積滿block(accumulate full blocks of input )(iflag only); nonblock 讀寫數據採用非阻塞IO方式 noatime 讀寫數據不更新訪問時間
time+dd 測磁盤讀寫速度性能
一、先熟悉兩個特殊的設備及一些相關參數:測試
1) time有計時做用,dd用於複製,從if讀出,寫到of;spa
2) if=/dev/zero(產生字符)不產生IO,所以能夠用來測試純寫速度;操作系統
3) 同理of=/dev/null(回收站、無底洞)不產生IO,能夠用來測試純讀速度;code
4) 將/tmp/test拷貝到/var則同時測試了讀寫速度;htm
5) bs是每次讀或寫的大小,即一個塊的大小,count是讀寫塊的數量。
當寫入到驅動盤的時候,咱們簡單的從無窮無用字節的源 /dev/zero 讀取,當從驅動盤讀取的時候,咱們讀取的是剛纔的文件,並把輸出結果發送到無用的 /dev/null。在整個操做過程當中, DD 命令會跟蹤數據傳輸的速度而且報告出結果。
2.測試磁盤寫能力(寫速度)
time dd if=/dev/zero of=test.dbf bs=8k count=300000
其中/dev/zero是一個僞設備,它只產生空字符流,對它不會產生IO,因此,IO都會集中在of文件中,of文件只用於寫,因此這個命令至關於測試磁盤的寫能力,上面爲每一塊大小是8k,共有300000塊。
輸出的結果相似(由於通常更長測試時間更準確,因此能夠設置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上,也至關於測試磁盤的讀能力。(Ctrl+c終止測試)
輸出的結果相似:
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/s
上面指的是從if的路徑寫到of的路徑,或者從if的路徑輸出到of的路徑
bs的命令使用形式是:bs=xxx count=mmm
含義:bs=600 count=1,備份第一塊爲600個字節的區域.(默認大小爲512個字節)
bs=512 count=2,備份前2塊總共爲1024個字節的區域
dd的輸出是:
x+y records in
m+n records out
其中 x和m的含義是 x和m個完整的塊(也就是你用bs指定的塊大小)被讀入和寫出。
其中y和n的含義是 y和n個不完整的塊(部分塊)被讀入和寫出。
最多見產生的不完整塊的讀入是因爲碰到了讀入的文件尾,好比你有一個文件a.log的大小是10個字節,你用下面的命令就會出現1+1的狀況,由於第二個塊不夠6個字節,只有4字節。
dd if=a.log of=b.log bs=6 count=21+1 records in1+1 records out常見的出現0+0的狀況是因爲被讀的文件是空文件(0字節),
好比下面的命令dd if=/dev/null of=b.log bs=6 count=20+0 records in0+0 records out
四、測試同時讀寫能力
time dd if=/dev/sdb of=/testrw.dbf bs=4k
在這個命令下,一個是物理分區,一個是實際的文件,對它們的讀寫都會產生IO(對/dev/sdb是讀,對/testrw.dbf是寫),假設它們都在一個磁盤中,這個命令就至關於測試磁盤的同時讀寫能力。
五、測試純寫入性能
dd if=test of=/dev/null bs=8k count=10000 iflag=direct
命令結尾添加oflag=direct將跳過內存緩存,添加oflag=sync將跳過hdd緩存。
六、測試純讀取性能
dd if=test of=/dev/null bs=8k count=10000 iflag=direct
eg1:Router上進行讀寫測試腳本:
#!/bin/sh rm /mnt/mmcblk0p1/ddtest 'dev下面的mmcblk0p1的設備,mnt下面的mmcblk0p1是個目錄,才能夠讀寫 mytime=1 while [ 1 ] do echo "===NO."$mytime" TEST===" time dd if=/dev/zero of=/mnt/mmcblk0p1/ddtest bs=8k count=10240 ’mmcblk0p1下建立ddtest文件夾,往文件夾裏寫入數據 sleep 5 rm /mnt/mmcblk0p1/ddtest sleep 3 echo "" let mytime=mytime+1 done
寫一塊是8k 一共寫了10240塊 數據一共是 8k*10240 = 80M
注意:dd 只能提供一個大概的測試結果,並且是連續 I/O 而不是隨機 I/O,理論上文件規模越大,測試結果越準確。 同時,iflag/oflag 提供 direct 模式,direct 模式是把寫入請求直接封裝成 I/O 指令發到磁盤,非 direct 模式只是把數據寫入到系統緩存就認爲 I/O 成功,並由操做系統決定緩存中的數據何時被寫入磁盤。(參考連接:http://www.360doc.com/content/15/0906/17/8737500_497292503.shtml)
【測試說明】
純讀:time dd if=/dev/mmcblk1p3 of=/dev/null bs=8k
純寫:time dd if=/dev/zero of=/ysdisk/iotest bs=8k count=102400
屢次測試,取平均值
*******************************************
【特定場景的io分析】
構造特定場景,記錄經過命令iostat -zx 1查看並記錄當前io狀況