Linux 中用 dd 命令來測試硬盤讀寫速度


dd 是 Linux/UNIX 下的一個非常有用的命令,作用是用指定大小的塊拷貝一個文件,並在拷貝的同時進行指定的轉換。

dd 命令通用語法格式如下:

dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks

 

命令簡介
主要選項(指定數字的地方若以下列字符結尾乘以相應的數字: b=512, c=1, k=1024, w=2, xm=number m): 
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 參數說明:

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、先熟悉兩個特殊的設備及一些相關參數:

1) time有計時作用,dd用於復制,從if讀出,寫到of;

2) if=/dev/zero產生字符)不產生IO,因此可以用來測試純寫速度

3) 同理of=/dev/null回收站、無底洞)不產生IO,可以用來測試純讀速度

4) 將/tmp/test拷貝到/var則同時測試了讀寫速度;

5) bs是每次讀或寫的大小,即一個塊的大小,count是讀寫塊的數量。

當寫入到驅動盤的時候,我們簡單的從無窮無用字節的源 /dev/zero 讀取,當從驅動盤讀取的時候,我們讀取的是剛才的文件,並把輸出結果發送到無用的 /dev/null。在整個操作過程中, DD 命令會跟蹤數據傳輸的速度並且報告出結果。

2、測試磁盤寫能力

time dd if=/dev/zero of=/testw.dbf bs=4k count=100000

因為/dev//zero是一個偽設備,它只產生空字符流,對它不會產生IO,所以,IO都會集中在of文件中,of文件只用於寫,所以這個命令相當於測試磁盤的寫能力。命令結尾添加oflag=direct將跳過內存緩存,添加oflag=sync將跳過hdd緩存。
3、測試磁盤讀能力

time dd if=/dev/sdb of=/dev/null bs=4k

因為/dev/sdb是一個物理分區,對它的讀取會產生IO,/dev/null是偽設備,相當於黑洞,of到該設備不會產生IO,所以,這個命令的IO只發生在/dev/sdb上,也相當於測試磁盤的讀能力。(Ctrl+c終止測試)

4、測試同時讀寫能力

time dd if=/dev/sdb of=/testrw.dbf bs=4k

在這個命令下,一個是物理分區,一個是實際的文件,對它們的讀寫都會產生IO(對/dev/sdb是讀,對/testrw.dbf是寫),假設它們都在一個磁盤中,這個命令就相當於測試磁盤的同時讀寫能力。

5、測試純寫入性能

dd if=/dev/zero of=test bs=8k count=10000 oflag=direct

6、測試純讀取性能

dd if=test of=/dev/null bs=8k count=10000 iflag=direct

 

注意: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

 

操作實例

使用一塊“三星 Evo 120G” 的固態硬盤,實驗中,把硬盤接在 SATA 2.0 端口上。

1)寫入速度

首先讓我們寫入固態硬盤

$ dd if=/dev/zero of=./largefile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied,4.82364 s,223 MB/s

1M的大小實際上是相當大的。你可以嘗試用更小的尺寸如 64K 甚至是 4K 的。

2)讀取速度

現在讀回這個文件。但是,得首先清除內存的緩存,以確保這個文件確實是從驅動盤讀取的

運行下面的命令來清除內存緩存

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

現在讀取此文件

$ dd if=./largefile of=/dev/null bs=4k
165118+0 records in
165118+0 records out
676323328 bytes (676 MB) copied,3.0114 s,225 MB/s

 

參考鏈接:1)dd命令使用詳解;2)dd命令測試linux磁盤讀寫速度;3) Linux系統中使用DD命令測試USB和SSD硬盤的讀寫速度;4)dd命令詳解;5)linux dd 測試磁盤I/O性能的注意事項;6)GNU官方說明

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM