¿Qué podría causar hijos prefork de Apache profundamente anidados?

¿Qué podría causar hijos prefork de Apache profundamente anidados?

Estoy ejecutando Apache 2.2.25 con prefork y mod_perl en CentOS (principalmente 6.4). Recientemente, un caso se volvió particularmente loco, al separar a los hijos de los hijos de los niños:

<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>

Al mismo tiempo, la caja se quedó sin memoria (no estoy seguro de qué fue primero, si la bifurcación profunda o si la memoria se agotó).

Nunca había visto a Apache hacer esto antes y aún no he identificado la causa. Las dos posibilidades que estoy investigando son una pérdida de memoria en mod_perl (o más bien en nuestro código que luego persiste debido a mod_perl) o un exploit de seguridad que permite alguna bomba de bifurcación limitada (no puede bifurcar hijos arbitrarios pero puede bifurcar datos adicionales niños apaches).

No estoy seguro de qué causaría que Apache se bifurcara de esta manera (editarOriginalmente mencioné una creencia errónea sobre qué tan elegante funcionaba), pero mi pensamiento aquí es que una pérdida de memoria de tipo referencia circular (ya sea directa o indirectamente simplemente usando toda la memoria disponible en la caja) causó algún tipo de confusión mod_perl que resultó en trabajadores adicionales. hijos que se bifurcan a partir de hijos en lugar del padre principal. No tengo una razón real para esto, solo intento conciliar los dos problemas (bifurcación profunda y uso de memoria).

Alternativamente, es posible que tengamos un problema de seguridad que deba rastrear.

¿Alguien ha visto este tipo de comportamiento en Apache antes y conoce una solución?

Respuesta1

Resulta que se trataba de una bifurcación de código en mod_perl (lo cual ya es una mala idea) y luego lo empeoró al no limpiar al niño. Bajo mod_perl, cuando bifurcas, no estás bifurcando tu código, estás bifurcando apache. Entonces, ese niño continúa entregando contenido como cualquier otro niño de Apache bifurcado, pero no se incluye en el recuento y, por lo tanto, nunca será eliminado si obtiene demasiadas instancias.

información relacionada