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
Each CONV symbol may be:
fdatasync physically write output file data before finishing // 對應conv=fdatasync
fsync likewise, but also write metadata
區別:
使用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