我需要传输 20 GB虚拟机vdisk 文件(存储 CentOS 6.5 VM 的根文件系统)从一台实验室服务器传输到另一台实验室服务器。由于文件很大,而且我曾经将这样的 vdisk 文件压缩到几百兆字节,所以我本能地启用了压缩,scp
但令我惊讶的是,传输速度相当慢。然后我尝试bzip2
结合ssh
和cat
,结果大吃一惊。以下是方法和平均吞吐量的摘要。
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 分区上的交换和休眠文件,否则您正在复制垃圾,它只会被丢弃并重新创建。