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

问题描述 投票:9回答:2

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 lib从来没有得到超过9兆的传输速率。

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

我发现Linux ->Linux的上传速度最快。SUA的ssh服务器(Windows)只能为我提供最高13.5megabytess的上传速度(Linux ->Windows,使用arcfour算法w scp命令行),而Linux ->Linux(使用arcfour,w scp命令行)则是狂飙73.3megabytess。需要说明的是,这些Windows和Linux机器的型号、硬件等完全一样。

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

->使用了2个同步upload!调用,一个在另一个完成后。->使用了2个异步上传调用,一个在另一个开始之后 ->使用了2个Net::SCP对象,并将文件提交给非阻塞异步版本的upload(所以它们是并行运行的)这些不同的方法都没有带来任何显著的性能提升,这有点令人沮丧。

下面是测试的结果(文本增强了可读性,但类似于提供的代码的输出)。


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中),或者把它们改成你熟悉的任何测试线束来查看这种性能下降。

如果你不知道如何在库中提高这个性能,除了通过子壳调用scp实用程序外,你还有没有更多的想法,如何开辟一些额外的SCP传输的并行速度?

Rspec测试在这里。https:/gist.github.com703966

ruby performance sockets ssh scp
2个回答
0
投票

可能是时代变了,但以我目前的安装方式(Ruby 2.7,net-scp 3.0.0),使用Ruby的Net::SCP使用你的rspec文件的速度和我从命令行工具中得到的速度是差不多的(并行作业比单一命令行调用略快,但这是可以预期的)。

我发现唯一奇怪的地方是,你的rspec为每次测试上传了两次文件,但是却用总的时间和文件的大小来计算性能--这将会给出一个看起来比实际性能低一半的结果--例如:如果测试用了10秒的时间来传输一个10GB的文件,那么性能将被报告为1 Gbps,而实际上是2 Gbps,因为10秒内传输了20 GB。


-3
投票

您可以尝试 网际协议 来代替。 Sftp是一个较新的协议,而linux scp实用程序实际上使用sftp协议,如果它是可用的。 我不知道net-scp是否真的使用了sftp协议,但是如果没有的话,我也不会惊讶。

你也可以试试 rsync但这需要在远程主机上也安装rsync。 Rsync是目前远程文件传输速度的王者,虽然我不能保证6-rsync gem。

© www.soinside.com 2019 - 2024. All rights reserved.