首先了解兩個特殊設備
/dev/null 僞設備,回收站.寫該文件不會產生IO
/dev/zero 僞設備,會產生空字符流,對它不會產生IO
借鑑網上說法:
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,就是他是每一次寫都得等到這一次寫寫到了磁盤才進行下一個寫,也就是如果我們使用dd寫100次,他每次寫都是寫到磁盤後才進行下一次寫的。所以這樣當然要比conv=fsync慢一些吧。那麼自己感覺如果只是寫一次的話,兩者應該是差別不大的。
如果要規避掉文件系統cache,直接讀寫,不使用buffer cache,需做這樣的設置
iflag=direct,nonblock
oflag=direct,nonblock
iflag=cio
oflag=cio
direct 模式就是把寫入請求直接封裝成io 指令發到磁盤
a.測試磁盤的IO寫速度
time dd if=/dev/zero of=test.dbf bs=1000k count=10000 oflag=direct
####### 上面代碼如果要測試實際速度 還要在末尾加上 oflag=direct測到的纔是真實的IO速度
b.測試磁盤的IO讀速度
dd if=test.dbf bs=10k count=100000 of=/dev/null
####### 表示每次寫入/讀取10k的數據,執行100000次
dd命令可以通用,但不夠專業,也沒有考慮到緩存和物理讀的區分,測試的數據也是僅作參考,不能算是權威。
常用語法:dd if= of= bs= skip= seek= conv=
常用參數有:
 bs=n,block size,每次讀取 n bytes 寫入,可與 count 聯用;
 ibs=n,一次讀入 bytes 個字節 (default is 512);
 obs=n,一次性寫 n bytes 個字節 (default is 512);
 bs 可以同時設置上邊兩個參數;
 cbs=n,一次轉換 n 個 bytes,即轉換緩衝區大小。;
 count=n, bs 操作的次數,僅拷貝 n 個塊,如 dvd:  bs=1M count=4430;
 skip=n,指 if 後面的原文件跳過 n bytes 再開始讀取;
 seek=n,指 of 後面的目標文件跳過 n bytes 再開始寫入;
[root@my1-222 ~]# time dd if=/dev/zero of=test.dbf bs=8k count=300000
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 2.50417 s, 981 MB/s
real 0m2.537s
user 0m0.023s
sys 0m2.070s
[root@my1-222 ~]# time dd if=/dev/zero of=test.dbf bs=8k count=300000 oflag=direct
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 25.4357 s, 96.6 MB/s
real 0m25.550s
user 0m0.010s
sys 0m13.655s
[root@my1-222 ~]#
[root@my1-222 ~]# dd if=test.dbf bs=8k count=300000 of=/dev/null
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 1.94773 s, 1.3 GB/s
[root@my1-222 ~]#