Perl SFTP真的很慢

时间:2014-06-27 06:42:45

标签: perl ssh sftp

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

#!/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);

2 个答案:

答案 0 :(得分:2)

Net :: SSH2 / libssh2中对SFTP的支持不是最理想的。

使用Net :: SFTP :: Foreign(使用Net :: SSH2后端Net :: SFTP :: Foreign :: Backend :: Net_SSH2,如果你在Windows上)。

答案 1 :(得分:0)

我希望您正面临OpenSSH的Session Re-Keying问题,如下面的链接所示。

http://crashingdaily.wordpress.com/2007/02/20/a-workaround-for-netsftp-hanging-on-large-transfers/

此链接也解决了此问题。