
Я использую apache 2.2.25 с prefork и mod_perl на CentOS (в основном 6.4). Недавно один экземпляр сошел с ума, ответвив потомков потомков потомков:
<snip>
\_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
\_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
\_ /usr/sbin/httpd
\_ /usr/sbin/httpd
</snip>
В то же время у устройства закончилась память (я не уверен, что произошло раньше: глубокое разветвление или нехватка памяти).
Я никогда не видел, чтобы apache делал это раньше, и пока не сузил круг причин. Две возможности, которые я расследую, это утечка памяти в mod_perl (или, скорее, в нашем коде, который затем сохраняется из-за mod_perl) или эксплойт безопасности, который позволяет использовать ограниченную бомбу форка (не может отщеплять произвольные дочерние элементы, но может отщеплять дополнительные дочерние элементы apache).
Я не уверен, что могло заставить Apache так разветвиться (редактироватьПервоначально я упомянул ошибочное мнение о том, как работает graceful), но моя мысль здесь заключается в том, что утечка памяти типа round ref (прямо или косвенно, просто используя всю доступную память на коробке) вызвала некую путаницу mod_perl, которая привела к появлению дополнительных рабочих потомков, ответвляющихся от потомков вместо основного родителя. У меня нет для этого реальной причины, я просто пытаюсь примирить две проблемы (глубокое ответвление и использование памяти).
Или же у нас может быть уязвимость системы безопасности, которую мне нужно отследить.
Кто-нибудь сталкивался с подобным поведением Apache и знает решение?
решение1
Оказывается, это было разветвление кода под mod_perl (что само по себе плохая идея), а затем все усугубилось тем, что не был очищен дочерний элемент. Под mod_perl, когда вы разветвляете, вы не разветвляете свой код, вы разветвляете apache. Так что этот дочерний элемент продолжает обслуживать контент как любой другой разветвленный дочерний элемент apache, но не включается в подсчет и, следовательно, никогда не будет отсеян, если вы получите слишком много экземпляров.