【发布时间】: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 我没有问题。脚本进展顺利。
但是当我使用 max_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");