Что может вызвать глубоко вложенные дети 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. Затем этот потомок продолжает обслуживать контент, как и любой другой разветвленный апачский потомок, но не включается в счетчик и, следовательно, никогда не будет отбракован, если вы получите слишком много экземпляров.

Другие вопросы по тегам