2014-12-05 4 views
-1

Для оптимизации производительности и продолжительности, я хочу знать, кто ограничивает мое количество соединений SSH.Perl Expect limit limit

Сценарий BASH вызывает X perl-скрипты. Каждый скрипт perl создает новое SSH-соединение для другого IP-адреса.

Итак, вот как это работает:

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 и отправить много команд, продолжительность составляет около 3minutes

$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 Ожидайте, затем ждет 3 secondes перед запуском 200 раз. И ждите, пока все 400 не закончится, прежде чем начать снова.

EDIT: Как описано в разделе комментариев, я добавил «$!». к сообщению об ошибке, а затем у меня есть следующее:

./../../../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 
+0

«не может породить» не является ssh подключение выпуск не думаю.Это больше похоже на предел, предотвращающий «ssh» от начала. Посмотрите на свой 'ulimit'? Посмотрите на свои максимальные открытые файлы? –

+0

Невозможно создать это сообщение, которое я устанавливаю, когда ожидает DIE $ exp-> spawn ("ssh -o ConnectTimeout = $ connectTimeout $ user \ @ $ ip") или умереть ("невозможно вызвать \ n"); (см. выше :)) –

+0

Хорошая точка. Итак, включите фактическую ошибку в это сообщение и посмотрите, что на самом деле не работает? –

ответ

0

Похоже, что это не ограничение процесса, а ограничение открытого файла.

Добавление этих строк:

restools   soft nproc   2048 
restools   soft nofile   2048 

в /etc/security/limits.conf файл решить проблему! Первая строка ограничивает количество активного процесса до 2048 И второе, число открытых файлов до 2048 Оба из них был ранее 1024

Испытано и одобрено