最快的方式来传输小文件(比scp快)

Scp传输单个文件的速度很慢。 什么是最快的方法来做到这一点?

我需要的速度的原因不是因为我有大量的文件传输。 我只想单个文件传输(从头到尾)快速完成(所以rsync和tar和传输速度不够快)。

传输许多小文件有很多限制。 有人已经提到:networking延迟,磁盘写入速度等,但其中大部分可以通过使用“rsync”进行优化。 如果目标文件不存在,并且您确信该进程不会中断,那么使用tarpipe道将会非常高效:

cd /SOURCE/DIR && tar cf - . | ssh DESTINATIONHOST "cd /DESTINATION/DIR && tar xpvf -" 

基本上你需要把所有文件一起批处理,这样SCP的启动/closures开销只发生一次。 如果你为每个文件启动/closures,那将是非常低效的。 上面的“焦油”pipe道将做到这一点。 事实上,所有用例中的90%都足够好了。

这个“焦油pipe道”具有并行处理的好处(在一个进程中读取,而在另一个进程中写入)。 但是它受到一些限制:

  1. TCP / IP将永远不会使用它的pipe道的100%。
  2. 每个进程都受限于只能执行一次写入或一次读取的磁盘。 如果你使用旋转磁盘,那很好。 如果您使用SSD或RAID(允许多个并行读取的RAID种类),则此技术将不能执行。

你可以通过各种黑客来解决#2,如运行两个或更多的进程,每个进程的文件的一个子集。 然而这些都不完善,有点草率。

TCP / IP更难以解决,并将继续成为您的限制。 实际上,如果您调整系统以使一切都达到最佳状态,TCP / IP将不会使用完整的pipe道。 每次TCP / IP认为它已经find了最佳的发送速率,它会尝试发送更多一点来testing是否有“更多的空间”可用。 这将失败,并且TCP / IP将退后一步。 这个不断的增加/失败/退避循环意味着TCP / IPstream将在100%的利用率和50%的利用率之间交替…结果是,平均来说,pipe道将被利用75-80%。 (注:这些估计是…做一些谷歌searchfind确切的数字,重点是,这将是平均100%,而不是100%,因此它不会是100%) 。

如果你运行多个TCP / IPstream,它们都将不断循环通过这个增加/失败/退避循环。 如果你不走运,他们都会同时发生碰撞,而且都退后很远,导致pipe道未充分利用。 如果你幸运的话,他们会碰撞得更less,你会得到一个看起来像很多弹跳球的图表…仍然留下pipe道利用不足。

哦,如果你有一台TCP / IP实现的机器没有最新的优化,或者没有完全调整,它可以把整个系统发送出去。

所以如果TCP / IP太糟糕了,为什么我们继续使用它? 在共享pipe道的许多不同types的stream量的典型情况下,情况并不是那么糟糕。 这里的问题是,你有一个非常具体的要求非常具体的应用程序。 所以你需要一个非常具体的解决scheme 幸运的是,许多人也在你的位置,所以这些解决scheme变得更容易find。

http://asperasoft.com/这样的系统通过UDP / IP使用自定义协议,以便他们可以控制back-off / retyalgorithm。 它们使用前向纠错(FEC),以便小错误不需要重传(TCP / IP是一个小错误是退信的信号),自定义压缩scheme,增量复制以及它们自己的退避algorithm,限速系统来实现pipe道的完全(或接近完全)利用。 这些都是专有的,所以不清楚Aspera和他们的竞争对手使用什么技术,或者确切地说他们是如何工作的。

有许多公司已经发明了这样的系统,或者把它们作为自己产品的一部分,或者把它们作为商品出售。

目前我还不知道任何开源的实现。 (我想纠正!)

如果这是一个非常紧迫的问题,值得花钱来解决,尝试一个商业产品。 或者,如果您无法更改软件,则需要购买更大的pipe道。 幸运的是,10G和40Gnetworking接口的价格正在下降。

William Glick开发了一个优雅的解决scheme:并行化rsync。

 /bin/bash # SETUP OPTIONS export SRCDIR="/folder/path" export DESTDIR="/folder2/path" export THREADS="8" # RSYNC TOP LEVEL FILES AND DIRECTORY STRUCTURE rsync -lptgoDvzd $SRCDIR/ /$DESTDIR/ # FIND ALL FILES AND PASS THEM TO MULTIPLE RSYNC PROCESSES cd $SRCDIR; find . -type f | xargs -n1 -P$THREADS -I% rsync -az % /$DESTDIR/% # IF YOU WANT TO LIMIT THE IO PRIORITY, # PREPEND THE FOLLOWING TO THE rsync & cd/find COMMANDS ABOVE: # ionice -c2 

神奇的发生在xargs -P ,它自动把input分成$THREADS块。 快速,高效,简单。

有关详细信息,请参阅William的原始出版物