O que poderia fazer com que as crianças do apache prefork profundamente aninhadas?

2

Estou executando o apache 2.2.25 com prefork e mod_perl no CentOS (principalmente 6.4). Recentemente, um exemplo foi particularmente descontrolado, tirando crianças de filhos de crianças:

<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 sei o que veio primeiro, a bifurcação profunda ou a memória se esgotando).

Eu nunca vi o apache fazer isso antes e ainda não reduzi a causa. As duas possibilidades que estou investigando são um vazamento de memória em mod_perl (ou melhor, em nosso código que persiste por causa de mod_perl) ou uma exploração de segurança que permite uma limitada garfo (não é possível separar crianças arbitrárias, mas apache).

Não tenho certeza do que poderia fazer com que o apache bifurque assim ( edição originalmente mencionei uma crença equivocada sobre o quão gracioso funcionou) mas meu pensamento aqui é que um vazamento circular de memória do tipo ref (ou direta ou indiretamente, usando apenas toda a memória disponível na caixa) causou algum tipo de confusão mod_perl que resultou em bullying de filhos adicionais de crianças em vez do pai principal. Não tenho uma razão real para isso, apenas tentando reconciliar os dois problemas (bifurcação profunda e uso de memória).

Como alternativa, podemos ter uma exploração de segurança que preciso rastrear.

Alguém já viu esse tipo de comportamento no apache antes e sabe de uma solução?

    
por Rob Van Dam 14.01.2014 / 02:11

1 resposta

0

Acontece que isso foi código bifurcando em mod_perl (que já é uma má idéia) e, em seguida, tornando-se pior por não limpar a criança. Sob mod_perl, quando você bifurca, você não está bifurcando seu código, você está bicando o apache. Então, essa criança continua a servir conteúdo como qualquer outra criança bifurcada bifurcada, mas não é incluída na contagem e, portanto, nunca será abatida se você tiver instâncias demais.

    
por 15.01.2014 / 20:11