
Estou executando o Apache 2.2.25 com prefork e mod_perl no CentOS (principalmente 6.4). Recentemente, um caso deu errado, eliminando filhos de filhos de filhos:
<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>
Ao mesmo tempo, a caixa ficou sem memória (não tenho certeza do que veio primeiro, a bifurcação profunda ou a memória acabando).
Eu nunca vi o Apache fazer isso antes e ainda não identifiquei a causa. As duas possibilidades que estou investigando são um vazamento de memória no mod_perl (ou melhor, em nosso código que persiste por causa do mod_perl) ou uma exploração de segurança que permite alguma bomba de fork limitada (não pode desembolsar filhos arbitrários, mas pode desembolsar adicionais crianças apache).
Não tenho certeza do que faria com que o Apache se bifurcasse assim (editarEu mencionei originalmente uma crença equivocada sobre como o gracioso funcionava), mas meu pensamento aqui é que um vazamento de memória do tipo ref circular (direta ou indiretamente, usando apenas toda a memória disponível na caixa) causou algum tipo de confusão no mod_perl que resultou em trabalhador adicional filhos bifurcando-se dos filhos em vez do pai principal. Não tenho nenhum motivo real para isso, apenas estou tentando conciliar os dois problemas (bifurcação profunda e uso de memória).
Alternativamente, podemos ter uma exploração de segurança que preciso rastrear.
Alguém já viu esse tipo de comportamento do Apache antes e conhece uma solução?
Responder1
Acontece que esse código foi bifurcado no mod_perl (o que já é uma má ideia) e piorou a situação por não limpar o filho. No mod_perl, quando você bifurca, você não está bifurcando seu código, você está bifurcando o Apache. Então, esse filho continua servindo conteúdo como qualquer outro filho do Apache bifurcado, mas não é incluído na contagem e, portanto, nunca será abatido se você obtiver muitas instâncias.