[英]Perl Expect spawn limit
對於性能問題和持續時間優化,我想知道誰限制了我的 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,然后在再次啟動 200 之前等待 3 秒。 然后,等待所有 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
看來這不是進程限制,而是打開文件限制。
添加這些行:
restools soft nproc 2048
restools soft nofile 2048
到/etc/security/limits.conf
文件解決了這個問題! 第一行將活動進程數限制為 2048 第二行將打開文件數限制為 2048 之前都是 1024
經過測試和批准
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.