Pad every input block to size of 'ibs' with trailing zero bytes. When used with 'block' or 'unblock', pad with spaces instead of zero bytes.shell
Synchronize output data just before finishing. This forces a physical write of output data.數據庫
Synchronize output data and metadata just before finishing.This forces a physical write of output data and metadata.緩存
flag分爲oflag和iflagasync
Use synchronized I/O for data. For the output file, this forces a physical write of output data on each write. For the input file, this flag can matter when reading from a remote file that has been written to synchronously by some other process. Metadata (e.g., last-access and last-modified time) is not necessarily synchronized.測試
Use synchronized I/O for both data and metadata.this
dsync跟sync比較好理解,前者是隻同步寫數據,sync同時寫數據和元數據spa
可是感受dsync與 -fsync怎麼感受有些同樣? 網上的說法是 dd if=/dev/zero of=test bs=64k count=4k oflag=dsync 這個能夠當成是模擬數據庫插入操做,因此很慢,但仍是沒太明白。操作系統
後來本身認真的摳了這英文用詞, 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,注意這裏邊用詞 a physical write of output data on each write,那就是他是每一次寫都得等到這一次寫寫到了磁盤才進行下一個寫,也就是若是咱們使用dd寫100次,他每次寫都是寫到磁盤後才進行下一次寫的。因此這樣固然要比conv=fsync慢一些吧。那麼本身感受若是隻是寫一次的話,二者應該是差異不大的,後來作了下小實驗,證明確實是這樣的。code
在第一個圖中,咱們只寫1塊,而後使用oflag=sync與conv=fsync 測出來一個是32.1kb/s 一個是37.8kb/s 差異不大。可是下一個我寫1000個,conv=fsync就明顯的比oflag=dsync/sync快不少了,因此以爲上面本身扣的英文的理解應該是正確的。ci
因此在用dd作讀或者寫的時候,應該要注意本身的使用場景,若是須要將數據寫入磁盤的話
dd if=/dev/zero of=test bs=64k count=16k 是不許確的,
而 dd if=/dev/zero of=test bs=64k count=16k conv=fsync 比較準備,他在dd結束前會寫到磁盤,
而dd if=/dev/zero of=test bs=64k count=4k oflag=dsync或者sync 是真正的每寫一次就寫一次磁盤,因此其實能夠聽到磁盤啪啪啪的響的。
若是要規避掉文件系統cache,直接讀寫,不使用buffer cache,需作這樣的設置
iflag=direct,nonblock
oflag=direct,nonblock
iflag=cio
oflag=cio
direct 模式就是把寫入請求直接封裝成io 指令發到磁盤
非direct 模式,就把數據寫入系統緩存,而後就認爲io 成功,並由操做系統決定緩存中的數據何時被寫入磁盤
$ dd if=/dev/zero of=test bs=64k count=4k oflag=dsync 記錄了4096+0 的讀入 記錄了4096+0 的寫出 268435456字節(268 MB)已複製,48.6814 秒,5.5 MB/秒
$ dd if=/dev/zero of=test bs=8k count=256k conv=fdatasync 記錄了262144+0 的讀入 記錄了262144+0 的寫出 2147483648字節(2.1 GB)已複製,41.277 秒,52.0 MB/秒
咱們會發現第一行命令執行完,僅生成了 268 MB 的數據,用時卻長達 48+ 秒。
而第二行命令執行完,雖然生成了 2.1GB 的數據,比第一行命令生成的數據大的多,可是用時卻只有 41+ 秒,反而用時少。
爲何呢?
請注意下 oflag=dsync 參數,這個參數代表每當須要寫數據時都會真正到寫到磁盤上,等寫到磁盤上以後,纔會繼續開始下一次數據寫入。第一行命令要求反覆寫 4k 次數據,也就是說,會真正寫磁盤 4k 次,用時長是理所固然的。
而第二行命令,雖然總共要寫 2.1 GB 的數據,可是因爲使用的是 conv=fdatasync 參數,也就是說,當 dd 命令結束前,一次性把全部的數據寫到磁盤上,所以寫入速度很是快。
咱們再作一個測試,仍是使用上面兩個命令,參數相同,不一樣的僅是 count 參數設置爲 1,bs 設置爲 256 MB。那麼根據以前的說明,咱們能夠推測,兩次測試的結果應該是相近的。
$ dd if=/dev/zero of=test bs=256MB count=1 oflag=dsync 記錄了1+0 的讀入 記錄了1+0 的寫出 256000000字節(256 MB)已複製,3.85186 秒,66.5 MB/秒
$ dd if=/dev/zero of=test bs=256MB count=1 conv=fdatasync 記錄了1+0 的讀入 記錄了1+0 的寫出 256000000字節(256 MB)已複製,4.23802 秒,60.4 MB/秒