我目前正在使用我之前創建的 dd 映像恢復 USB 記憶棒。然而,注意到寫入速度非常差,約為 7 MB/s,儘管棒通常要快得多。
環顧四周後,我注意到正在從 USB 驅動器讀取大量數據,這解釋了寫入性能不佳的原因。當時只有 dd 正在存取該裝置。
編輯atop
行:
sdd: busy 101% | read 18020 | write 613 | MBr/s 7.04 | MBw/s 7.1
當使用 dd 直接寫入 md 數組時,我注意到類似的行為。但是,當使用 dd 寫入已安裝的檔案系統時,這種情況不會發生。
所以我的問題是,為什麼直接寫入區塊設備時會從U盤讀取數據,是否可以防止這種情況以提高寫入效能?
答案1
因此,並不是 100% 清楚可能發生的情況,但我懷疑您正在將小塊(512 位元組)寫入 USB,然後 dd 檢查以確保位元組寫入正確 - 導致大量讀取和寫入寫作,以及閱讀和寫作。
將區塊大小調整到「正確」的大小並非易事,但有一些關於如何做到這一點的經驗法則。一般來說,我發現 64kB 區塊大小在大多數方面都是一個很好的折衷方案 - 但如果您運行任何奇異的東西(例如zfs
),您的檔案系統可以驅動對此進行更改。
試試這樣的事情:
lbzcat image-dd.bz2 | dd of=/deb/sdX bs=64k
如需更長的討論,請查看這個帖子。
答案2
對我來說,dd
預設使用頁面快取。我認為這在具有頁面快取的系統上是正常的。頁面快取需要讀取儲存設備,這會導致寫入速度慢。
對我來說,有 3 種方法可以解決這個問題並獲得全速:
- 將區塊大小設定
dd
為 4096 或其倍數。 (沒有讀取) - 將區塊大小設定
dd
為足夠大的數字。對我來說,這個數字大約是 100 萬或以上。我全速大約100萬。 (很少讀) - 不要透過提供
dd
參數來使用頁面快取oflags=direct
。將區塊大小設定dd
為 512 的足夠大的倍數bs=120k
。 (沒有讀取)
在我的系統上需要注意的事項區塊大小對於所有儲存設備和頁面大小是 4096 位元組。發現於:
blockdev --getbsz /dev/sd?
getconf PAGESIZE
也扇區大小是512位元組。
fdisk
也許parted
可以告訴你扇區大小。