为什么有压缩的 scp 比没有压缩的慢?

为什么有压缩的 scp 比没有压缩的慢?

我需要传输 20 GB虚拟机vdisk 文件(存储 CentOS 6.5 VM 的根文件系统)从一台实验室服务器传输到另一台实验室服务器。由于文件很大,而且我曾经将这样的 vdisk 文件压缩到几百兆字节,所以我本能地启用了压缩,scp但令我惊讶的是,传输速度相当慢。然后我尝试bzip2结合sshcat,结果大吃一惊。以下是方法和平均吞吐量的摘要。

  • scp -C vm1-root.img [email protected]:/mnt/vdisks/,11MB/秒。
  • bzip2 -c vm1-root.img | ssh -l root 192.168.161.62 "bzip2 -d -c > /mnt/vdisks/vm1-root.img",5 MB/s。这个更低的结果促使我在网上搜索。
  • scp -c arcfour -C vm1-root.img [email protected]:/mnt/vdisks/,13 MB/s。这种用法-c arcfour是在一个答案在 serverfault 上。这几乎没有帮助。最后,我禁用了压缩。
  • scp vm1-root.img [email protected]:/mnt/vdisks/,23MB/秒。

压缩不是应该更快吗?


在收到ssh(1)@sven 的手册页提示后,我尝试了几种不涉及压缩的替代文件传输方法,都获得了更好的效果。

  • cat vm1-root.img | ssh -l root 192.168.161.62 "cat > /mnt/vdisks/vm1-root.img",26MB/秒。

  • nc -l 5678 > /mnt/vdisks/vm1-root.img在接收器和nc 192.168.161.62 5678 < vm1-root.img发送器上,速度均为 40 MB/s。端口 5678是任意可用的端口。

使用nc原来是最快的复制方法!

过去,scp -C每当我认为它可以正常工作时,它都会工作得很好。例如,在传输/var/log/messages*几 GB 大小的 syslogs () 时。几百 KB/s 的未压缩传输速率将增加到 1-2 MB/s。正如手册页中指出的那样,此示例确实在连接速度较慢的情况下失败。

我遇到过这种情况,一个 20 GB 分区的新创建的虚拟磁盘映像压缩后大小只有 200 MB。传输速率约为 25 MB/s,我们可以在 8 秒内完成复制,而不是超过 13 分钟!显然,scp在这种情况下不进行压缩是低效的,scp -C甚至更糟。

我想,这里学到的主要教训是,scp -C应该认为压缩只是一种便利。如果文件可以显著压缩,那么最好先在源上压缩,传输压缩格式,最后在目标上解压。快速执行压缩和解压的工具(例如压缩包) 将会有更大的帮助。

答案1

引用man ssh(这是 使用的基础scp):

在调制解调器线路和其他慢速连接上,压缩是可取的,但只会降低快速网络的速度。

问题在于压缩数据比通过网络发送数据需要更多时间。

答案2

此外,除了压缩之外,nc 还具有最佳速率,因为它也不加密。无损压缩依赖于查找数据的冗余部分,当在网络级别完成此操作时,您最多可以查看 [buffer-size] 字节,而当首先处理整个文件时,最多可以在 [file-size] 字节内搜索和处理重复的字节语句。

此外,对于移动磁盘映像,您应该使用文件系统感知工具,例如 ntfsclone/partclone,因为即使压缩也无法击败直接跳过未分配的块 - 如果您不必传输任何数据,您的传输速率将是无限的。另外,不要忘记销毁 Windows 分区上的交换和休眠文件,否则您正在复制垃圾,它只会被丢弃并重新创建。

相关内容