为什么通过 gzip 管道“dd”比直接复制要快得多?

Foo*_*Bar 83 backup performance gzip dd pipe

我想通过 100 Mbit/s 的线路备份从我网络中的一台计算机到同一网络中的另一台计算机的路径。为此我做了

dd if=/local/path of=/remote/path/in/local/network/backup.img
Run Code Online (Sandbox Code Playgroud)

这给了我大约 50 到 100 kB/s 的非常低的网络传输速度,这将永远需要。所以我停止了它并决定尝试动态压缩它以使其更小,以便传输的数量更少。所以我做了

dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz
Run Code Online (Sandbox Code Playgroud)

但是现在我得到了大约 1 MB/s 的网络传输速度,因此速度提高了 10 到 20 倍。注意到这一点后,我在多个路径和文件上进行了测试,结果始终相同。

为什么管道dd通过gzip也会大大增加传输速率,而不是只将流的字节长度减少很多?由于压缩时 CPU 消耗较高,我原以为传输速率会略有下降,但现在我得到了双重加分。不是我不高兴,而是我只是想知道。;)

小智 102

dd默认情况下使用非常小的块大小——512 字节 (!!)。也就是很多小的读写。似乎dd在您的第一个示例中天真地使用了生成大量有效负载非常小的网络数据包,从而降低了吞吐量。

另一方面,gzip它足够聪明,可以使用更大的缓冲区进行 I/O。也就是说,网络上的大写次数较少。

你能不能dd用更大的bs=参数再试一次,看看这次是否效果更好?

  • 谢谢,尝试直接复制 * 没有 * `gzip` 和 `bs=10M` 的块大小 -> 大约 3 或 4 MB/s 的快速网络传输。与小块大小 + `gzip` 相比,更高的块大小 + `gzip` 没有任何改变。 (21认同)
  • 如果您想查看什么高块大小,请在 gzip 之后尝试另一个 dd。 (7认同)

小智 5

有点晚了,但我可以补充...

在一次采访中,我曾被问到克隆逐位数据的最快方法是什么,并且使用ddor dc3ddDoD 资助)进行粗略响应。面试官确认管道dddd更有效,因为这只是允许同时读/写或在程序员术语中stdin/stdout,从而最终使写入速度加倍,传输时间减半。

dc3dd verb=on if=/media/backup.img | dc3dd of=/dev/sdb
Run Code Online (Sandbox Code Playgroud)