【问题标题】:Perl Expect spawn limitPerl 期望生成限制
【发布时间】:2015-02-03 16:45:03
【问题描述】:

对于性能问题和持续时间优化,我想知道谁限制了我的 SSH 连接数。

BASH 脚本正在调用 X perl 脚本。每个 perl 脚本都会生成一个指向不同 IP 的新 SSH 连接。

所以,这就是它的工作原理:

max_proc_ssh=400

while read codesite ip operateur hostname
do 
    (sleep 3; /usr/bin/perl $DIR/RTR-sshscript.pl $codesite $ip $operateur $hostname) &
        ((current_proc_ssh++))
    if [ $current_proc_ssh -eq $max_proc_ssh ]; then
        printf "Pausing with $max_proc_ssh processes...\n"
        current_proc_ssh=0
        wait
    fi
done<<<"$temp_info"

并且每个 RTR-sshscript.pl 都会通过 SSH 连接生成一个新的 Expect 并发送大量命令,持续时间约为 3 分钟

$exp->spawn("ssh -o ConnectTimeout=$connectTimeout $user\@$ip") or die ("unable to spawn \n");

所以,使用 max_proc_ssh=200 我没有问题。脚本进展顺利。 但是当我使用 ma​​x_proc_ssh=400 时,Expect 模块无法处理它。它有时会告诉我**unable to spawn** 我想说的是,从预期的 400 人开始,只有 350 人真正开始,类似这样。

这有什么问题?我正在尝试定义一个 sublimit 以避免同时启动 400 个期望,例如:

max_proc_ssh=400
max_sublimit_ssh=200

while read codesite ip operateur hostname
do 
    (sleep 3; /usr/bin/perl $DIR/RTR-sshscript.pl $codesite $ip $operateur $hostname) &
    ((current_proc_ssh++))
    ((current_sublimit_ssh++))
    if [ $current_sublimit_ssh -eq $max_sublimit_ssh ]; then
        printf "Pausing sublimit SSH reached..."
        sleep 3
        current_sublimit_ssh=0
    fi
    if [ $current_proc_ssh -eq $max_proc_ssh ]; then
        printf "Pausing with $max_proc_ssh processes...\n"
        current_proc_ssh=0
        current_sublimit_ssh=0
        wait
    fi
done<<<"$temp_info"

这将允许 SSH 启动 200 Expect,然后等待 3 秒,然后再次启动 200。 然后,等待所有 400 完成后再重新开始。

编辑:如评论部分所述,我添加了“$!”到错误消息,然后我有这个:

./../../../scripts/mynet/RTR-scan-snmp.sh: fork: retry: Resource temporarily unavailable
./../../../scripts/mynet/RTR-scan-snmp.sh: fork: retry: Resource temporarily unavailable
./../../../scripts/mynet/RTR-scan-snmp.sh: fork: retry: Resource temporarily unavailable
./../../../scripts/mynet/RTR-scan-snmp.sh: fork: retry: Resource temporarily unavailable
./../../../scripts/mynet/RTR-scan-snmp.sh: fork: retry: Resource temporarily unavailable
./../../../scripts/mynet/RTR-scan-snmp.sh: fork: retry: Resource temporarily unavailable
./../../../scripts/mynet/RTR-scan-snmp.sh: fork: retry: Resource temporarily unavailable

这是什么意思?我压倒了分叉限制?我怎样才能增加它? 通过修改sysctl.conf文件?

当我自己搜索一点时,他们说检查什么

sysctl fs.file-nr

在说 但是当我启动脚本时,它不会比这更高:

 sysctl fs.file-nr
fs.file-nr = 27904      0       793776

我的用户的 ulimit 是 4096 但是当脚本启动时,计数器会比这高得多:

 sudo lsof -u restools 2>/dev/null | wc -l
25258

【问题讨论】:

  • “无法生成”不是我认为的 ssh 连接问题。这听起来更像是阻止ssh 甚至无法启动的限制。看看你的ulimits?看看你的最大打开文件数?
  • Unable to spawn 是我在预期 DIE $exp->spawn("ssh -o ConnectTimeout=$connectTimeout $user\@$ip") 或 die ("unable to spawn \ n"); (见上文:))
  • 好点。那么在该消息中包含实际错误并查看实际失败的原因是什么?
  • 如何在我设置的这条消息中包含错误?有 $exp->error ?
  • 猜测die ("unable to spawn - $!\n");

标签: bash perl ssh expect.pm


【解决方案1】:

看来不是进程限制,而是打开文件限制。

添加这些行:

restools         soft    nproc           2048
restools         soft    nofile          2048

/etc/security/limits.conf 文件解决了这个问题! 第一行将活动进程数限制为 2048 而二、打开文件数为2048 他们俩以前都是1024

测试和批准

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多