-1

对于性能问题和持续时间优化,我想知道谁限制了我的 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 都会生成一个新的 Expect 并通过 SSH 连接发送大量命令,持续时间约为 3 分钟

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

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

这有什么问题?我正在尝试定义一个子限制以避免同时启动 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
4

1 回答 1

0

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

添加这些行:

restools         soft    nproc           2048
restools         soft    nofile          2048

/etc/security/limits.conf归档解决了问题!第一行将活动进程数限制为 2048 第二行将打开的文件数限制为 2048 之前都是 1024

经过测试和批准

于 2014-12-08T15:17:28.843 回答