it-swarm-es.com

¿Qué puede hacer que Apache HTTPD use el 100% de la CPU de forma indefinida?

Una aplicación que ejecuta Apache HTTPD 2.0 con poca carga ha tenido ocasionalmente problemas en los que uno (¿o más?) De los procesos de Apache ocupaba el 100% de la CPU. Actualmente ejecutamos HTTPD 2.2, es posible que también hayamos visto esto con 2.2. No estoy seguro. En algunos casos, el uso de la CPU fue tal que bloqueó todo menos el acceso a la consola al servidor de Windows que aloja HTTPD. Nunca he podido rastrear qué puede causar que Apache haga esto.

El entorno es Apache HTTPD que sirve directamente contenido estático, utilizando mod_rewrite pero no mucha más configuración personalizada. HTTPD está hablando con Apache Tomcat (5.x) a través de mod_jk (1.2.25).

¿Alguien más ha encontrado esto y lo ha resuelto? La solución que instalamos es limitar cada subproceso HTTPD de Apache a un número máximo de solicitudes con la siguiente configuración:

MaxRequestsPerChild 1000

donde debido a que la aplicación usa HTTP/1.1, esto es realmente más de 1000 solicitudes por proceso secundario y más como 100,000 solicitudes por proceso secundario.

3
Eddie

Lo más probable es que el bloqueo se produzca en un módulo en lugar de en el propio Apache. Tu configuración suena bastante mínima, así que sospecho que mod_jk como culpable. Si limitar MaxRequestsPerChild soluciona el problema, diría que es una solución aceptable. Es posible que un error en el módulo solo se active después de un tiempo prolongado o de muchas solicitudes y, a menos que esté realmente interesado en rastrearlo, probablemente sea suficientemente bueno hacer que desaparezca.

Si desea rastrearlo, lo primero que debe hacer es configurar CoreDumpDirectory para que apunte a alguna ubicación en la que el usuario del servidor pueda escribir. Si puede hacer que el proceso infractor deje un archivo central, entonces debería ayudarlo a rastrear la causa del problema. Puede encontrar algunas sugerencias sobre cómo hacer esto en la Guía de depuración de Apache .

5
John Dalton

Cuando he visto esto, ha sido porque: - una aplicación o script alojado está causando el problema. Por ejemplo, tiene un bucle infinito o algo así: el sistema operativo se ha vuelto inestable debido a un bloqueo o algún otro problema en el que el reinicio resolvió temporalmente el problema.

Mi sugerencia: - reiniciar la máquina. - espere y vea si esto sucede nuevamente - reinicie el servidor sin mods, etc. - Comience a encender cada mod uno por uno y observe el uso cada vez.

2
cbrulak

instalar mod_proctitle para Apache

1
dims

De hecho, he visto que esto sucede cuando tiene un directorio de registro que no existe. No estoy seguro de por qué no lo manejan mejor, pero es posible que desee asegurarse de que todos los directorios de registro estén allí y que el proceso pueda escribir en ellos.

1
carson

RLimitCPU no siempre ayuda porque no todas las partes del código Apache tienen comprobaciones.

Es posible que MaxRequestsPerChild tampoco ayude, ya que he visto esto con niños relativamente "nuevos".

En mi caso, sospecho que tiene algo que ver con el módulo que estamos usando (mod_Perl) y quizás algo con una conexión de socket rota. Parece que solo vemos este problema con los navegadores que se conectan, no desde wget o curl (que usamos mucho para la 'entrega de datos').

1
ericslaw

Limitar MaxRequestsPerChild ayudará con el uso de la memoria, pero no debería afectar a la CPU de la forma en que está hablando. Lo que probablemente suceda es que su mod_jk se está bloqueando y, dado que es un módulo de Apache, aparece bajo el proceso httpd.

1
reconbot