我正在使用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);
答案 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/
此链接也解决了此问题。