对于性能问题和持续时间优化,我想知道谁限制了我的 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