【问题标题】:Perl SFTP really really slowPerl SFTP 真的很慢
【发布时间】:2014-08-18 04:36:00
【问题描述】:

我正在使用 perl Net:SSH2 库来执行 SFTP。它工作得很好,但超级慢。它开始时比链接速度慢 7 倍(我可以处理),但几乎只要它传输了 2MB 的数据,它就会下降到慢 1000 倍。这是我的代码的精简版。我使用这个 Linux 命令创建了一个 10M 的随机数据文件dd if=/dev/urandom of=10M.dat bs=1M count=10。对于想要运行代码的任何人,请输入服务器、用户、密码等详细信息。

#!/usr/bin/perl

use strict;
use warnings;
use Fcntl ('O_WRONLY', 'O_CREAT');
use Net::SSH2;
use Time::HiRes qw(gettimeofday);

my $server = 'myserver';
my $username = 'myusername';
my $password = 'mypassword';
my $remoteFile = 'delme.dat';
my $localFile = '10M.dat';

my $ssh = Net::SSH2->new();
$ssh->connect($server) or die('Failed to connect to remote server for sftp');
$ssh->auth_password($username, $password);
$ssh->auth_ok() or die('Invalid username or password');
my $sftp = $ssh->sftp() or die('Ahhh!!');
open(my $localHandle, '<', $localFile) or die($!);
my $remoteHandle = $sftp->open($remoteFile, O_WRONLY | O_CREAT) or die($sftp->error());
my $tran = 0;
my $t = gettimeofday();
while(my $line = <$localHandle>)
{
  print $remoteHandle $line;
  $tran += length($line);
  my $newTime = gettimeofday();
  if($newTime - $t > 1)
  {
    print 'Speed is ' . ($tran / ($newTime - $t)) . "B/sec\n";
    $t = $newTime;
    $tran = 0;
  }
}
close($remoteHandle);
close($localHandle);

【问题讨论】:

  • 您和您要将文件发送到的此服务器之间的网络链接是什么类型的?文件传输只会与最慢的链接一样快。您还可能遇到 QoS(服务质量)问题或某种速率限制。
  • 另外,我不知道它有多大帮助,但您应该考虑使用 sysread() 以块的形式读取文件,而不是逐行读取。跨度>
  • 如果我从命令行使用 sftp,链接会以 5.0MB/s 的速度运行一整天,所以我很确定它就是这个模块。我不确定为什么它在 5 时如此稳定,但事实就是这样。

标签: perl ssh sftp


【解决方案1】:

Net::SSH2/libssh2 对 SFTP 的支持并不理想。

请改用Net::SFTP::Foreign(如果您使用的是Windows,请使用Net::SSH2 backend Net::SFTP::Foreign::Backend::Net_SSH2)。

【讨论】:

  • hmmmm,虽然使用 Net::SSH2 后端似乎很慢。
猜你喜欢
  • 2017-11-10
  • 2010-12-28
  • 2013-01-25
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多