C libssh2-通道读取挂起

C libssh2-通道读取挂起,c,perl,ssh,libssh2,C,Perl,Ssh,Libssh2,我目前正在开发一个基于perl的远程作业调度器。 它必须通过ssh连接到x服务器,并执行已定义的作业/作业组 我使用Net:SSH2,它构建在libssh2之上 我的程序通常可以在400/500台服务器上正常运行,但是当我尝试在1000台服务器上运行basicuptime命令时,我的一个或多个线程挂起并且永远不会完成,或者大约30分钟后 它是随机的:有时按时完成,有时不按时完成 我跟踪了这个问题,因为它来自这个Net::SSH2命令:$in.=$buf,而$chan->read($buf,102

我目前正在开发一个基于perl的远程作业调度器。 它必须通过ssh连接到x服务器,并执行已定义的作业/作业组

我使用Net:SSH2,它构建在libssh2之上

我的程序通常可以在400/500台服务器上正常运行,但是当我尝试在1000台服务器上运行basic
uptime
命令时,我的一个或多个线程挂起并且永远不会完成,或者大约30分钟后

它是随机的:有时按时完成,有时不按时完成

我跟踪了这个问题,因为它来自这个Net::SSH2命令:
$in.=$buf,而$chan->read($buf,10240)

以下是连接的完整代码:

my $chan = $this->{netssh2}->channel() or die $!;
$chan->blocking(1);
$chan->exec($command);
my ($in,$err,$buf,$buf_err);

$in .= $buf while $chan->read( $buf, 10240 );
$err .= $buf_err while $chan->read( $buf_err, 10240, 1 );

$chan->send_eof;
1 while !$chan->eof;

$chan->wait_closed;
然后我下载了一个Net::SSH2源代码包,并修改了C-perl链接(xs)文件。 它告诉我问题来自于这一行:
count=libssh2\u channel\u read\u ex(ch->channel,XLATEXT,pv\u buffer,size)

此命令随libssh2库提供:

有时(大约1000次中有1次)程序进入此读取,并且从不离开。受影响的服务器在大多数情况下是不同的

你知道我应该找什么/检查什么吗?
我已经为此工作了几天,我非常希望得到一个外部建议:)

除非您发布代码的相关部分,包括如何创建和操作会话和通道对象,否则这是不可能帮助您的。我在代码中添加了ssh连接部分(我认为这不会有帮助,但可能会更清楚)。我读到libssh2不是线程安全的,所以这可能是我的问题?我使用Net::OpenSSH作为替代,它工作得很好,但我更喜欢Net::SSH2,因此,如果有任何可能使它与Net::SSH2一起工作,我正在侦听=)您作为
$command
传递的确切信息是什么<代码>正常运行时间
?如果通过stderr发送的数据过多,代码将被阻塞。还包括初始化Net::SSH2会话和建立连接的代码。如果只从一个线程按顺序进行调用,是否可以重现该问题?此外,还包括Net::SSH2和libssh2的版本。您还可以为libssh2启用调试:
$ssh2->debug(1)
(但这需要使用调试支持编译的libssh2)。除非您发布代码的相关部分,包括会话和通道对象的创建和操作方式,否则无法为您提供帮助。我在代码中添加了ssh连接部分(我不认为这会有帮助,但它可能会变得更清晰)。我已经读到libssh2不是线程安全的,所以这可能是我的问题?我使用Net::OpenSSH作为替代品,它工作得很好,但我更喜欢Net::SSH2,所以如果有任何可能使它与Net::SSH2一起工作,我正在听=)你作为
$command
到底传递了什么<代码>正常运行时间
?如果通过stderr发送的数据过多,代码将被阻塞。还包括初始化Net::SSH2会话和建立连接的代码。如果只从一个线程按顺序进行调用,是否可以重现该问题?此外,还包括Net::SSH2和libssh2的版本。您还可以为libssh2启用调试:
$ssh2->debug(1)
(但这需要使用调试支持编译的libssh2)。