Для оптимизации производительности и продолжительности, я хочу знать, кто ограничивает мое количество соединений 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
«не может породить» не является ssh подключение выпуск не думаю.Это больше похоже на предел, предотвращающий «ssh» от начала. Посмотрите на свой 'ulimit'? Посмотрите на свои максимальные открытые файлы? –
Невозможно создать это сообщение, которое я устанавливаю, когда ожидает DIE $ exp-> spawn ("ssh -o ConnectTimeout = $ connectTimeout $ user \ @ $ ip") или умереть ("невозможно вызвать \ n"); (см. выше :)) –
Хорошая точка. Итак, включите фактическую ошибку в это сообщение и посмотрите, что на самом деле не работает? –