Как я могу избежать зомби в Perl скрипты CGI, запущенные под Apache 1.3?

Различные сценарии Perl (Сторона сервера Включает) называют модуль Perl со многими функциями на веб-сайте.Править: Сценарии используют lib использования для ссылки на библиотеки от папки. В течение напряженных периодов сценарии (не библиотеки) становятся зомби и перегружают сервер.

Списки сервера:

319 ?        Z      0:00 [scriptname1.pl] <defunct>    
320 ?        Z      0:00 [scriptname2.pl] <defunct>    
321 ?        Z      0:00 [scriptname3.pl] <defunct>

У меня есть сотни экземпляров каждого.

Править: Мы не используем ветвление, систему или должностное лицо, независимо формируем директиву SSI

<!--#exec cgi="/cgi-bin/scriptname.pl"-->

Насколько я знаю, в этом случае httpd самостоятельно будет владелец процесса. MaxRequestPerChild установлен на 0, который не должен позволять родителям умереть, прежде чем дочерний процесс будет закончен.

До сих пор мы полагали, что временно приостановка некоторых сценариев помогает серверу, справляющемуся с более не существующими процессами, и препятствует тому, чтобы он запинался и падал однако за процессы-зомби, все еще формируются без сомнения. По-видимому, gbacon, кажется, является самым близким к истине с его теорией, что сервер не способен справляться с загрузкой.

Что могло привести к httpd, отказывающемуся от этих процессов? Там какая-либо лучшая практика должна предотвратить их?

Спасибо

Ответ: точка переходит к Rob. Как он говорит, сценарии CGI, которые генерируют SSI, не будут иметь тех, которых обработал SSI. Оценка SSI происходит перед выполнением CGI в цикле запроса Apache 1.3. Это было зафиксировано с Apache 2.0 и позже так, чтобы CGI мог генерировать команды SSI.

Так как мы работали на Apache 1.3 для каждого просмотра страницы, SSI превратился в более не существующие процессы. Хотя сервер пытался очистить их, это было слишком занято выполняющимися задачами смочь успешно выполниться. В результате сервер упал, и станьте безразличными. Как краткосрочное решение мы рассмотрели весь SSI и переместили некоторые процессы к стороне клиента к свободному ресурсы сервера, и дайте ему время для чистки. Позже мы обновили до Apache 2.2.

7
задан 14 revs, 4 users 99% 27 January 2010 в 13:06
поделиться

3 ответа

Я только что видел ваш комментарий, что вы используете Apache 1.3 и это может быть связано с вашей проблемой.

SSI могут запускать CGI. Но CGI-скрипты, которые генерируют SSI, не будут работать с этими SSI. Оценка SSI происходит до запуска CGI в цикле запросов Apache 1.3. Это было исправлено в Apache 2.0 и более поздних версиях, чтобы CGI могли генерировать SSI команды.

Как я уже предлагал выше, попробуйте запустить свои скрипты самостоятельно и посмотрите на результат. Генерируют ли они SSI?

Edit: Пытались ли вы запустить тривиальный Perl CGI скрипт, чтобы просто распечатать HTTP-ответ типа Hello World?

Тогда, если это сработает, добавьте тривиальные SSI директивы типа

<!--#printenv -->

и посмотрите, что произойдет.

Edit 2: Просто поняли, что, вероятно, происходит. Зомби возникают, когда дочерний процесс завершает свою работу, а не пожинается. Эти процессы зависают и медленно используют ресурсы в таблице процессов. Процесс без родителя - это осиротевший процесс.

Вы отбрасываете процессы в вашем Perl скрипте? Если да, то добавили ли вы вызов waitpid() в родительский?

Получили ли вы также правильный выход внутри скрипта?

CORE::exit(0);
2
ответ дан 7 December 2019 в 03:15
поделиться

Больше пластыря, чем передовой опыт, но иногда можно обойтись без простой

$SIG{CHLD} = "IGNORE";

документации Perlipc

На большинстве платформ Unix сигнал CHLD (иногда также известный как CLD) имеет особое поведение относительно значения 'IGNORE' . Установка $SIG{CHLD} на 'IGNORE' на такой платформе приводит к тому, что не создаются зомби-процессы, когда родительский процесс не может wait() на своих дочерних процессах (т.е., дочерние процессы автоматически повторяются). Вызов wait() с помощью $SIG{CHLD}, установленный в 'IGNORE', обычно возвращает -1 на таких платформах.

Если вас волнуют статусы выхода дочерних процессов, вам необходимо собрать их (обычно называемые "пожинанием"), вызвав wait или waitpid. Несмотря на жуткое имя, зомби - это всего лишь дочерний процесс, который вышел из игры, но чей статус ещё не был возвращён.

Если ваши программы на Perl сами по себе являются дочерними процессами, превращающимися в зомби, это означает, что их родителям (тем, кто вытягивает и забывает ваш код) нужно убрать за собой следы. Процесс не может остановить себя от превращения в зомби

.
7
ответ дан 7 December 2019 в 03:15
поделиться

Так как все биты у вас есть, я бы предложил запускать отдельные скрипты по одному из командной строки, чтобы посмотреть, сможете ли вы заметить те, что висят.

Показывает ли список ps чрезмерное количество запущенных экземпляров одного конкретного скрипта?

Вы запускаете CGI с помощью mod_perl?

Правка: Только что видел ваши комментарии по поводу SSI. Не забывайте, что SSI директивы могут сами запускать Perl скрипты. Посмотрите, что CGI пытаются запустить?

Зависит ли они от еще одного сервера или службы?

.
0
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: