簡體   English   中英

Perl 期望生成限制

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM