在Linux系統中經常會使用dd命令來測試硬盤的寫入速度,命令會涉及到兩個參數:dsync與fdatasync,本文介紹一下其區別。
dd if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 oflag=dsync
dd if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 conv=fdatasync
相信上述兩個在Linux系統上使用dd測試磁盤INPUT性能的命令各位都看過,甚至使用過。
兩個都是往硬盤中寫入1 Gbytes的數據,只是第一個的速度慢的要命。
使用dsync,dd會從/dev/zero中,每次讀取4Kbytes數據,然后直接寫入到硬盤當中,重復此步驟,直到共讀取并且寫入了1 Gbytes的數據。
使用fdatasync,dd會從/dev/zero中一次性讀取1 Gbytes的數據,寫入到磁盤的緩存中,然后再從磁盤緩存中讀取,一次性寫入到硬盤當中。
/dev/在內存當中,和緩存一樣,讀取速度都非常快,因此兩種方式最終的讀取速度對最終的寫入速度無任何影響。
換種說法,就是此處不管有沒有的硬盤緩存,對IO都不產生任何影響。
那也就是說,兩種方式的主要差異就在于多步與一步。
為什么寫入速度會有如此大的差異?
看完這個比喻,你就會明白了:
現在有兩輛一模一樣的車,最高行駛速度為20 M/s,加速度為5 M/s^2,分別為甲車,乙車,他們都要走直線的,1000 M的路程。
甲車每次只能走四米,達到四米就得剎車,乙車可以一次性走完一千米。
相信大家也清楚,甲車還沒加速到最高速度,就得剎車,走完這一千米需要不少時間。
而乙車,可以一直加速到其所能達到的最大速率,走完這一千米,花的時間明顯比甲少。
因此可以推斷,使用dsync,以1 Gbytes為blocksize,次數為一的方式往硬盤中寫入1 Gbytes的數據,結果將不會與dd if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 conv=fdatasync有太大的差距。