題 為什麼通過gzip滾動'dd'比直接複製快得多?


我希望通過100 Mbit / s線路備份從我的網絡中的計算機到同一網絡中的另一台計算機的路徑。為此,我做到了

dd if=/local/path of=/remote/path/in/local/network/backup.img

這給了我一個非常低的網絡傳輸速度,大約50到100 kB / s,這將永遠。因此我停止了它並決定嘗試在運行中將其壓縮以使其更小,以便傳輸的數量更少。所以我做了

dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz

但是現在我得到了1 MB / s的網絡傳輸速度,因此速度提高了10到20倍。注意到這一點後,我在幾個路徑和文件上測試了它,它總是一樣的。

為什麼管道 dd 通過 gzip 還可以通過一個很大的因子來提高傳輸速率,而不是僅僅通過一個很大的因子來減少流的字節長度? 由於壓縮時CPU消耗較高,我預計傳輸速率會有小幅下降,但現在我得到了雙倍的優勢。不是說我不高興,但我只是想知道。 ;)


77
2018-05-29 08:35


起源


512字節是早期Unix中文件存儲的標準塊大小。由於所有內容都是Unix / Linux中的文件,因此它幾乎成為了所有內容的默認設置。大多數實用程序的較新版本增加了但不是dd。 - DocSalvager
簡單的答案是 dd 輸出速度為1MB / s ......正好等待 gzip 管。它與塊大小關係不大。 - Tullo_x86


答案:


dd 默認情況下使用非常小的塊大小 - 512字節(!!)。也就是說,很多小的讀寫操作。看起來 dd在你的第一個例子中使用naively,生成大量具有非常小的有效載荷的網絡數據包,從而降低了吞吐量。

另一方面, gzip 足夠聰明,可以使用更大的緩衝區進行I / O操作。也就是說,通過網絡進行較少量的大寫操作。

你能試一下嗎 dd 又一個更大的 bs= 參數,看看這次效果是否更好?


98
2018-05-29 09:25



謝謝,試過直接複製 無  gzip 和一個塊的 bs=10M  - >快速網絡傳輸大約3或4 MB / s的東西。更高的塊大小+ gzip 與小塊大小相比,沒有改變任何東西 gzip。 - Foo Bar
如果你想看看高塊大小在gzip之後嘗試另一個dd。 - Joshua
是gzip自己做輸出緩衝,還是只使用stdio? - Barmar
@Barmar如果我正確地閱讀了源代碼,那就簡單了 write(3)s到緩衝區。
@CongMa你也可以嘗試使用pigz而不是gzip,它會更快地工作 - GioMac


有點遲到,但我可以補充一下......

在接受采訪時我曾被問過 什麼是最快的克隆逐位數據的方法 並且使用粗略響應 dd 要么 dc3dd (國防部資助)。採訪者證實了管道 dd 至 dd 更有效率,因為這只是允許 同時讀/寫 或者以程序員的方式 stdin/stdout因此,寫入速度和半轉移時間最終加倍。

dc3dd verb=on if=/media/backup.img | dc3dd of=/dev/sdb

4
2017-09-07 21:41





聰是對的。您正在將未壓縮的磁盤塊從遠程主機流式傳輸。您的網絡接口,網絡和遠程服務器是限制。首先,您需要提高DD的性能。指定與磁盤緩衝區內存對齊的bs =參數將從磁盤獲得最高性能。比如說bs = 32M。然後,這將從驅動器緩衝區填充sata或sas line rate strait的gzip緩衝區。磁盤將更傾向於順序傳輸,從而提供更好的吞吐量。 Gzip將壓縮流中的數據並將其發送到您的位置。如果您使用的NFS將允許nfs傳輸最小化。如果您使用的是SSH,則會產生SSH封裝和加密開銷。如果你使用netcat,那麼你沒有加密頭。


0
2018-06-26 23:31





我在這裡假設您所指的“轉移速度”正在報告中 dd。這實際上是有道理的,因為 dd實際上是每秒傳輸10倍的數據量!然而, dd 沒有通過網絡傳輸 - 該工作正由該工作處理 gzip 處理。

一些背景: gzip 將盡可能快地從其輸入管道中使用數據,以清除其內部緩衝區。速度 gzip緩衝區清空取決於幾個因素:

  • I / O寫入帶寬(由網絡造成瓶頸,並保持不變)
  • I / O讀取帶寬(從現代機器上的本地磁盤讀取遠遠高於1MB / s,因此不是可能的瓶頸)
  • 它的壓縮率(我將假設您的10倍加速率約為10%,表明您正在壓縮某些高度重複的文本,如日誌文件或某些XML)

所以在這種情況下,網絡可以處理100kB / s,和 gzip 將數據壓縮到10:1左右(並且不會受到CPU的瓶頸)。這意味著當它輸出100kB / s時, gzip 能夠 消耗 1MB / s,消費率是多少 dd 可以看到。


0
2017-10-21 04:57