【发布时间】: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 时如此稳定,但事实就是这样。