Ruby和Net :: SCP传输(套接字)的性能问题

SCP上传速度似乎受到命令行scp实用程序能够实现的极大限制。 我知道这是Ruby(1.9.2-p0),但Net :: SCP大约比Linux实用程序慢8倍(见大文件见......见下)。 我很想知道(我快速浏览了一下代码),如果这是在Ruby中的套接字,或者可以更好地复用Net :: SCP套接字?

我注意到,无论我尝试上传什么样的上传(串行上传,频道异步操作,使用多个scp对象实例),我永远无法在SCP上传中获得超过9兆字节/秒的传输速度。 现在......让我解释一下我调查的细节:

1)尝试了不同的加密算法

我使用了不同类型的加密,但没有明显的速度变化。示例:我可以使用命令行scp(加密算法= arcfour128)提交我的1GB测试文件,并在内部千兆位连接上获得73.3兆字节/秒的传输速率。 使用Net :: SCP.upload库,我的内部千兆位连接的速度从来没有超过9兆字节/秒。

2)尝试不同的主机/操作系统

我发现Linux - > Linux上传速度最快。 SUA的SSH服务器(Windows)只能提供给我一个最大的13.5megabytes / s的上传速度(Linux的 - 视窗>,使用ARCFOUR算法W / scp命令行),而Linux的 - > Linux操作系统(使用ARCFOUR,W / scp命令行)是令人bla目结舌的73.3兆字节/秒。 我应该提到这些Windows和Linux机器是完全相同的型号,硬件等。

3)尝试了不同的SCP上传方法

- >用2个同步上传! 一个接一个地完成。 - >使用2个异步上传调用,一个接一个地开始 - >使用2个Net :: SCP对象并将文件提交给非阻塞/异步版本的上传(因此它们并行运行)这些不同的方法给予任何显着的性能增益,这是令人沮丧的。

以下是测试的结果(增强了文字的可读性,但与提供的代码的输出类似):


Net::SCP
Done creating channels
Starting transfer of /home/seth/afpcases/systeme.afp # two upload! calls, one after another
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 126.07707 seconds (8.7168903909331 megabytes/s) should show transfer speed of serial uploads

Starting transfer of /home/seth/afpcases/systeme.afp # two upload calls, one after another, with a wait on both channels after both have started
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 122.588784 seconds (8.964931082112699 megabytes/s) should show transfer speed of simultaneous async channels.

Starting transfer of /home/seth/afpcases/systeme.afp # two upload calls on two separate Net::SCP objects, one after another, with a wait on both channels after both have started
Finished transfer of /home/seth/afpcases/systeme.afp
--> Duration: 122.822663 seconds (8.947860054133495 megabytes/s) should show transfer speed of simultaneous SCP instances

Finished in 371.761262 seconds

如果你有一个大文件(我使用了一个〜1GB的文件),你可以使用这些rspec测试(在scp_spec.rb中),或者将它们改为你熟悉的任何测试工具,以查看性能下降情况。

如果你不知道图书馆如何提高这种性能,那么除了通过子shell调用scp实用程序外,你是否还有更多关于如何打开一些额外的并行SCP传输速度的想法?

Rspec测试在这里:https://gist.github.com/703966


您可以尝试使用Net-sftp。 Sftp是一个较新的协议,如果可用,linux scp实用程序实际上使用sftp协议。 我不知道net-scp实际上是否使用sftp协议,但如果没有,我不会感到惊讶。

您也可以尝试使用rsync,但这也需要在远程主机上安装rsync。 尽管我无法购买six-rsync gem,但Rsync是远程文件传输速度之王。

链接地址: http://www.djcxy.com/p/92199.html

上一篇: Performance issues with Ruby and Net::SCP transfers (sockets)

下一篇: Why does LinkedHashMap class implement Map interface?