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