为什么通过gzip传递'dd'比直接复制要快得多?


79

我想通过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消耗较高,但是现在我得到了双倍的收益。不是说我不开心,而是想知道。;)


1
512字节是早期Unix中用于文件存储的标准块大小。由于所有内容都是Unix / Linux中的文件,因此它几乎成为所有内容的默认文件。大多数实用程序的较新版本已将其增加,但未增加dd。
DocSalvager 2014年

简单的答案是,dd正在以1MB / s的速度输出...进入等待gzip管道。它与块大小无关。
Tullo_x86

Answers:


100

dd默认情况下使用非常小的块大小-512字节(!!)。即,许多小的读取和写入。似乎dd在您的第一个示例中天真地使用了,它正在生成大量的网络数据包,而这些数据包的有效载荷非常小,从而降低了吞吐量。

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

您能否dd再次使用较大的bs=参数,看看这次是否效果更好?


20
谢谢,尝试了直接复制 gzip并且没有bs=10M -> 3或4 MB / s的快速网络传输。gzip与小块+相比,高块+ 没有任何改变gzip
Foo Bar

7
如果要查看高块大小,请尝试在gzip之后再尝试dd。
2014年

gzip是在做自己的输出缓冲,还是仅使用stdio?
2014年

@Barmar如果我正确地读取了源代码,则只需write(3)将其发送到缓冲区即可。

@CongMa您也可以尝试使用Pigz代替gzip,它的运行速度甚至更快
GioMac '16

4

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

在一次采访中,我曾被问到克隆逐位数据和使用dddc3dd由美国国防部资助)的粗略回答可能是最快的方法。采访者确认管道dd传输dd更有效,因为这仅允许同时进行读/写或用编程人员的方式进行stdin/stdout,因此最终使写入速度加倍,传输时间减半。

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

1
我认为那不是真的。我现在才尝试。dd status=progress if=/dev/zero count=100000 bs=1M of=/dev/null是22.5GB / s,dd status=progress if=/dev/zero count=100000 bs=1M | dd of=/dev/null bs=1M是2.7GB。因此,管道会使速度变慢。
falsePockets

0

聪是正确的。您正在将未压缩的磁盘中的块流式传输到远程主机。您的网络接口,网络和远程服务器是限制。首先,您需要提高DD的性能。指定与磁盘缓冲存储器对齐的bs =参数将使磁盘获得最大性能。例如说bs = 32M。然后,这将从驱动器缓冲区以sata或sas线速海峡填充gzip的缓冲区。磁盘将更倾向于顺序传输,从而提供更好的吞吐量。Gzip将压缩流中的数据并将其发送到您的位置。如果使用的是NFS,则将使nfs传输最小化。如果使用的是SSH,则将产生SSH封装和加密开销。如果使用netcat,则没有加密开销。


0

我在这里假设您所指的“传输速度”是由报告的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所见。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.