我正在使用perl Net:SSH2 2库来执行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);发布于 2014-06-28 07:57:02
在Net::SSH2/libssh2中对SFTP的支持是次优的。
改用Net::SFTP::Foreign (如果您在Windows上使用Net::SSH2 backend Net::SFTP::Foreign::Backend::Net_SSH2 )。
https://stackoverflow.com/questions/24445520
复制相似问题