2009-02-01 11 views
51

Tengo una aplicación con mucho tráfico en una máquina Debian y Apache ha comenzado a actuar de forma extraña.¿Cómo puedo evitar que se generen toneladas de procesos de apache cuando inicio Apache y procedo a matar mi máquina?

Cada vez que inicio apache, se generan toneladas de procesos de apache, la aplicación no se carga en absoluto, y muy rápidamente toda la máquina se congela y debe reiniciarse para reiniciar.

Esto es lo que me pasa por la parte superior inmediatamente después de iniciar Apache:

 
top - 20:14:44 up   1:16,  2 users, load average: 0.48, 0.10, 0.03 
Tasks: 330 total, 5 running, 325 sleeping, 0 stopped, 0 zombie 
Cpu(s): 12.0%us, 21.4%sy, 0.0%ni,  65.7%id, 0.2%wa, 0.1%hi, 0.7%si, 0.0%st 
Mem: 8179920k total,  404984k used, 7774936k free, 60716k buffers 
Swap: 2097136k total,  0k used,  2097136k free, 43424k cached 


10251 www-data 15 0 467m 8100 4016 S 6 0.1 0:00.04 apache2 
10262 www-data 15 0 467m 8092 4012 S 6 0.1 0:00.05 apache2 
10360 www-data 15 0 468m 8296 4016 S 6 0.1 0:00.05 apache2 
10428 www-data 15 0 468m 8272 3992 S 6 0.1 0:00.05 apache2 
10241 www-data 15 0 467m 8256 4012 S 4 0.1 0:00.03 apache2 
10259 www-data 15 0 467m 8092 4012 S 4 0.1 0:00.04 apache2 
10274 www-data 15 0 467m 8056 4012 S 4 0.1 0:00.03 apache2 
10291 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.03 apache2 
10293 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.03 apache2 
10308 www-data 15 0 468m 8296 4016 S 4 0.1 0:00.02 apache2 
10317 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.02 apache2 
10320 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.04 apache2 
10325 www-data 15 0 468m 8292 4012 S 4 0.1 0:00.04 apache2 

Y así sucesivamente .. con más procesos apache2.

Menos de un minuto después, puede ver a continuación que la carga ha pasado de 0,48 a 2,17. Si no paro el apache en este punto, la carga continúa aumentando durante unos minutos o menos hasta que la máquina muera.

 
top - 20:15:34 up 1:17,  2 users, load average: 2.17, 0.62, 0.21 
Tasks: 1850 total, 5 running, 1845 sleeping, 0 stopped, 0 zombie 
Cpu(s): 0.3%us,  2.1%sy, 0.0%ni, 96.4%id, 0.0%wa, 0.1%hi, 1.0%si, 0.0%st 
Mem:  8179920k  total,  1938524k used, 6241396k free, 60860k buffers 
Swap: 2097136k  total,  0k used, 2097136k free, 44196k cached 

Tenemos un servidor de seguridad donde colocamos en la lista blanca las direcciones que sabemos que están permitidas en nuestro sitio.

Cualquier idea sobre el problema podría ser bienvenida.

Gracias!

+0

No está relacionado con la programación ... Corrija el formato del resultado superior. Mire al trabajador de Apache MPM si necesita muchas conexiones simultáneas; el ajuste de su configuración keepalive también podría ayudar. –

+0

Gracias, no necesitamos todas esas conexiones concurrentes. De hecho, las cosas funcionaban bien sin tantas conexiones antes y solo han comenzado a actuar de forma extraña ahora, aunque el tráfico ha disminuido. –

+0

¿Por qué las personas votan esto por el cierre? Ejecuto Apache en mi máquina cuando hago desarrollo web en PHP o Python, y este podría ser un problema que enfrentaré algún día. Yo diría que es mucha programación. –

Respuesta

10

¿Ha cambiado su archivo de configuración recientemente? Si es así, ¿confío en que mantenga la versión anterior para diferir?

De lo contrario, busque las directivas "StartServers", "MaxSpareServers" y "MinSpareServers". En general, debe dejar esto en los valores predeterminados, pero es posible que se hayan configurado intencionalmente alto (mala idea) o configurado accidentalmente de esa manera debido a una mala configuración de edición.

Si esto no ayuda, es hora de mirar fuera de Apache, ya que hay un proceso que abre las conexiones a gran velocidad (podría ser que haya un proceso de prueba que se ha vuelto loco).

El primer paso es el registro de acceso. El segundo paso es ejecutar netstat, para ver de dónde pueden venir las conexiones. Y si se ejecuta en el mismo sistema, puede buscar en/proc/*/fd para encontrar los dos extremos de la conexión.

+0

Puedo repetir esa vieja versión manteniendo mucho. Incluso tenemos/etc/en nuestro SCM. – mark

+0

Establezco un repositorio git en la base de mi/etc/apache2. Muhaha. – CommaToast

41

Probablemente haya cometido el error de configurar Apache para usar mucho más que todo su RAM. Este es un error fácil de hacer.

Supongo que está utilizando un Apache Prefork y un servidor de aplicaciones en proceso (como PHP o mod_perl). En este modelo, terminará con un máximo de (MaxClients * máximo uso de memoria de su aplicación por proceso) memoria utilizada. Si no tiene casi tanto, es hora de disminuir uno, el otro o ambos.

En el caso general, esto significa la disminución de MaxClients al punto donde su servidor tiene suficiente memoria RAM para hacer frente.

Los valores predeterminados normalmente utilizados para MaxClients (150 son típicos) no son adecuados para ejecutar un servidor de aplicaciones pesado en proceso en una modesta máquina si está utilizando el modelo Prefork (la mayoría de los servidores de aplicaciones no admiten, o desalentar, el uso de modelos con rosca).

Sin embargo, la disminución de MaxClients eventualmente hará que la aplicación deje de estar disponible, especialmente si tiene keepalives activados y el tiempo de espera de keepalive es demasiado largo.Los procesos que solo mantienen una conexión activa (estado K en estado de servidor) todavía usan mucha RAM, y eso puede ser un problema: intente minimizar el tiempo de espera de keepalive o desactívelo por completo.

Debe vigilar el estado del servidor (provisto por mod_status).

Por supuesto, solo debe hacer CUALQUIERA de estos cambios si comprende las consecuencias. Piense dos veces, cambie la configuración una vez. Si tiene CUALQUIER capacidad para probar los cambios con carga simulada en una máquina no productiva de especificaciones similares, hágalo.

+19

"Piense dos veces, cambie la configuración una vez". +1 – aaronsnoswell

3

Como se ha dicho (asumiendo Prefork Apache) - MaxClients = procesos máx. A la vez.

Si usted encuentra que está recibiendo golpes con tráfico real (y no un StartServers mal configurado/min/MaxSpareServers), hay algunas otras cosas que puede hacer:

  1. Establecer un separada, ligero proceso de apache (o lighttpd) para su contenido estático. De esta manera, todos las cosas pequeñas y estáticas no "contaminan" su aplicación de peso proceso. Esto puede estar en el mismo servidor , o uno diferente. No importa .
  2. Ponga un proxy inverso como Squid en al frente de su proceso Apache. El proxy inverso absorberá rápidamente el contenido de Apache y lo almacenará en memoria y luego lo restituirá al cliente. De esta manera, los usuarios de AOL en módems de 14.4kb no acaparan un de sus valiosas ranuras Apache. Como una bonificación , dicha configuración puede ser configurada para almacenar en caché parte de su contenido para reducir la carga en sus procesos Apache .
2

Su salida 'superior' muestra que tiene mucha memoria libre, así que no creo que MaxClients sea un problema (a menos que haya algún problema con Apache asignando más de 2GB de memoria) Su registro de errores debería mostrar errores si tiene problemas para crear más hijos.

Es muy probable que sus procesos Apache realmente estén usando muchos recursos. Si está ejecutando aplicaciones PHP, intente instalar eAccelerator que hace un buen trabajo optimizando y almacenando en caché el código PHP. Otras cosas pueden incluir consultas pesadas de MySQL, una resolución lenta de DNS, etc. Más allá de eso, se trata más de comprender qué programas están siendo afectados y qué están haciendo.

14

utilizar ps -aux | grep apache para averiguar la cantidad de procesos en los que Apache se está ejecutando. Busque la columna "RSS" que proporciona una estimación de la memoria utilizada por cada proceso. También puede usar "arriba", donde cambia + f y luego selecciona la columna% MEM para ordenar los procesos por uso de memoria.

El número de procesos está determinado por la directiva "MaxClients" en su archivo apache.conf. La forma en que se llega a esta figura es como se describe en this page;

  1. SSH en su servidor como raíz.
  2. Ejecutar arriba.
  3. Presione shift + m.
  4. Tenga en cuenta la memoria RES más alta utilizada por httpd.
  5. Pulse Q para salir de la parte superior.
  6. ejecutar: service httpd stop (en Debian, sudo service apache2 stop)
  7. Una vez que se detuvo httpd, ejecute: -m libre
  8. Nota la memoria aparece en "usado".
  9. Encuentra la memoria garantizada para tu plan de VPS. El soporte puede decirle cuánto tiene garantizado si no puede encontrarlo.
  10. Reste la memoria UTILIZADA de la memoria que su plan está GARANTIZADO. Esto le dará su base GRATIS PISCINA DE MEMORIA.
  11. Multiplique el valor de su PISCINA DE MEMORIA GRATIS por 0.8 para encontrar su APACHE POOL DISPONIBLE promedio (esto le permitirá una reserva de memoria del 20% para los períodos de ráfaga).
  12. Divida su APACHE POOL DISPONIBLE por la memoria RES más alta utilizada por httpd. Esto le dará el valor de MaxClients que se debe establecer para su sistema. (Redúzcalo al entero más cercano menos que este valor si tiene un componente de fracción.)

El valor correcto para "MaxClients" asegurará la asignación de memoria correcta para su servidor apache. Así es como lo resolví.

En Debian, el archivo de configuración del Apache está en /etc/apache2/apache2.conf

2

Esta pregunta es antiguo, pero me siento obligado a añadir una respuesta aquí porque todas las respuestas existentes están pasando por alto una pieza clave de información de la OP: Después de la la carga ha comenzado a aumentar durante unos minutos, top informa que todavía hay una gran cantidad de recursos de memoria de la CPU & disponibles. Por lo general, queda un culpable, y eso es E/S.

Compruebe si hay una partición completa con df -h. De lo contrario, compruebe si su aplicación agita el disco utilizando vmstat 1 10 o iostat 1 10 (estos los proporciona el paquete 'sysstat' en Debian/Ubuntu). Si aún no ve un problema allí, tal vez tenga errores de E/S a nivel de dispositivo o problemas de red para el almacenamiento montado en la red. Verifique los archivos de registro del sistema y del daemon.

Cuestiones relacionadas