1. 程式人生 > >dd命令中dsync和fsync區別

dd命令中dsync和fsync區別

在Linux系統中經常會使用dd命令來測試硬碟的寫入速度,命令會涉及幾個常用引數:sync、dsync、fsync與fdatasync

# dd if=/dev/zero of=/tmp/1G bs=4k count=256000 oflag=dsync

# dd if=/dev/zero of=/tmp/1G bs=4k count=256000 oflag=sync

# dd if=/dev/zero of=/tmp/1G bs=4k count=256000 conv=fsync

# dd if=/dev/zero of=/tmp/1G bs=4k count=256000 conv=fdatasync 

上面4個命令都是往硬碟中寫入1G的資料,只是oflag=dsync和oflag=sync這兩個的速度慢的要命。

dd --help中對各引數作用描述如下:  

Each FLAG symbol may be:

       dsync           use synchronized I/O for data   // 對應oflag=dsync

       sync             likewise, but also for metadata 

// 對應oflag=sync

Each CONV symbol may be:

       fdatasync     physically write output file data before finishing  // 對應conv=fdatasync

       fsync            likewise, but also write metadata                       

// 對應conv=fsync

區別:
使用dsync/sync,dd會從/dev/zero中,每次讀取4Kbytes資料,然後直接寫入到硬碟當中,重複此步驟,直到共讀取並且寫入了1G的資料。
使用fdatasync/fsync,dd會從/dev/zero中一次性讀取1G的資料,寫入到磁碟的快取中,然後再從磁碟快取中讀取,一次性寫入到硬碟當中。


/dev/在記憶體當中,和快取一樣,讀取速度都非常快,因此兩種方式最終的讀取速度對最終的寫入速度無任何影響。 換種說法,就是此處不管有沒有的硬碟快取,對IO都不產生任何影響。那也就是說,兩種方式的主要差異就在於多步與一步。

dsync/sync是一次寫一個bs大小的資料,同步寫到磁碟後再繼續寫下一個IO;

fdatasync/fsync是每次寫一個bs大小資料到磁碟快取,dd命令結束前一次性將資料刷入磁碟中,因此IOPS比dsync/sync方式要高的多。

因此可以推斷,使用dsync,以1G為blocksize,次數為一的方式往硬碟中寫入1 Gbytes的資料,結果將不會與dd if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 conv=fdatasync有太大的差距。

CONV標識其他引數含義:

1. conv=notrunc,do not truncate the output file

2. conv=nocreat, do not create the output file

3. conv=excl,      fail if the output file already exists

FLAG標識其他引數含義:

1. oflag=direct, use direct I/O for data

2. oflag=nonblock, use non-blocking I/O

3. oflag=noatime, do not update access time