Я запускаю 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 разветвляться таким образом (редактировать Первоначально я упомянул ошибочное мнение о том, насколько изящно работает), но я думаю, что утечка памяти типа круговой ссылки (прямо или косвенно, просто используя всю доступную память на коробке) вызвала некоторую путаницу с mod_perl, что привело к дополнительному рабочему дети разветвляются от детей вместо основного родителя. У меня нет для этого реальной причины, я просто пытаюсь решить две проблемы (глубокое разветвление и использование памяти).
Кроме того, у нас может быть уязвимость системы безопасности, которую мне нужно отследить.
Кто-нибудь видел подобное поведение от apache раньше и знает решение?
Оказывается, это было разветвление кода под mod_perl (что уже является плохой идеей), а затем его усугубление из-за того, что не очищал ребенка. В mod_perl, когда вы разветвляете, вы не разветвляете свой код, вы разветвляете apache. Таким образом, этот дочерний элемент продолжает обслуживать контент, как любой другой ответвленный дочерний элемент apache, но не включается в счет и, следовательно, никогда не будет отбракован, если вы получите слишком много экземпляров.