从命令行SCP实用程序的能力来看,scp上传速度在库中似乎受到很大限制。我知道这是Ruby1.9.2-P0,但是Net::SCP比Linux实用程序慢大约8倍(使用大型文件.我很想知道(我快速地看了一下代码),这是中的套接字,还是可以更好地复用网络:SCP套接字?
我注意到,无论我尝试哪种方式(串行上传、异步运行的通道,使用scp对象的多个实例),我在SCP上传上都无法获得超过9MB/秒的传输速度。现在..。让我解释一下我的调查细节:
1)尝试了不同的加密算法
我使用了不同类型的加密,没有太多显著的速度变化:我可以使用命令行scp (加密算法= arcfour128)提交我的1GB测试文件,并在我的内部千兆字节连接上获得73.3兆字节/秒的传输速率。在使用Net::SCP.upload库的内部千兆字节连接上,我从未得到超过9MB/s的数据。
2)尝试了不同的主机/操作系统
我发现Linux -> Linux上传速度最快。SUA的ssh服务器只能为我提供最多13.5兆字节/秒的上传速度(Linux,使用->算法w/ scp命令行),而Linux -> Linux (使用are 4,w/ scp命令行)则是一个惊人的73.3兆字节/秒,我要指出的是,这些->和Linux是完全相同的型号、硬件等。
3)尝试了不同的SCP上传方法
->使用了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中),或者将它们更改为您熟悉的任何测试工具,以看到这种性能下降。
如果您不知道如何在库中提高这种性能,那么除了通过子subshell调用SCP实用程序之外,您还有其他关于如何打开scp传输的额外并行速度的想法吗?
这里的Rspec测试:https://gist.github.com/703966
发布于 2020-05-07 09:36:50
时代可能已经发生了变化,但在我当前的安装(Ruby2.7,Net-SP-3.0.0)中,使用rspec文件使用Ruby的Net::SCP的速度和我从命令行工具中得到的大致相同(并行作业比单个命令行调用略快,但这是预料中的)。
我唯一感到奇怪的是,您的rspec为每个测试上传了两次文件,但随后使用文件的总时间和大小来计算性能--这将给出的结果似乎是实际性能的一半--例如:如果测试用10 GB文件花费10秒钟,那么性能将报告为1 Gbps,而实际上是2 Gbps,因为在10秒钟内传输了20 GB。
发布于 2011-05-05 12:45:40
您可以尝试使用网-sftp。Sftp是一个较新的协议,linux实用程序在可用时实际上使用sftp协议。我不知道net是否真的使用sftp协议,但如果它不使用,我就不会感到惊讶了。
您也可以尝试rsync,但这也需要在远程主机上安装rsync。到目前为止,Rsync是远程文件传输的速度之王,尽管我无法为六rsync宝石提供凭单。
https://stackoverflow.com/questions/4208603
复制相似问题