Procesos de apache atorados por mucho tiempo

Iniciado por Cronck, 17 Julio 2014, 17:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Cronck

Buenos dias a todos..

Les cuento...

Hace unos dias tuve un problema con el servicio apache, de mi servidor, repentinamente dejo de contestar solicitudes y el sitio arroja error 503.

Tuve que reinicar el servicio httpd para que pudiera operar nuevamente.

Revisando entre los logs solo encontre algunas cosas que daban referencia a que el fastcgi estaba operando mal.

Citar[Tue Jul 15 18:26:49 2014] [notice] caught SIGTERM, shutting down
[Tue Jul 15 18:26:57 2014] [error] FastCGI process 7154 still did not exit, terminating forcefully
[Tue Jul 15 18:26:57 2014] [error] FastCGI process 7151 still did not exit, terminating forcefully
[Tue Jul 15 18:26:59 2014] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Tue Jul 15 18:27:00 2014] [warn] RSA server certificate CommonName (CN) `Parallels Panel' does NOT match server name!?

investigando encontré que es un problema del tiempo de sesión que maneja el fastcgi, por lo que aumente el timeout de 40 a 90

También aumente los valores del nginx en el parametro fastcgi_buffer de 32 a 256

No se ha presentado nuevamente el problema.

Pero ya entrando al tema como tal, para monitorear el comportamiento de apache, active el server-status y encontre algunas cosas que son las que quiero consultar con ustedes.

He estado viendo que si renicio el servicio los procesos operan normalmente, pero despues de un tiempo hay procesos que se quedan pegados por mucho tiempo

desconozco que es lo que esten haciendo o por que apache los retiene.  :¬¬
Tambien desconozco si sea por los cambios que hecho en el fastcgi.

Básicamente requiero saber por que se quedan pegados, que procesos son y saber si esto nos esta ocacionando el error de que deje de operar el apache  :-[

Los procesos que se quedan pegados son los que estan dentro del cuadro rojo



De antemano muchas gracias por el apoyo


Cronck

Complicado mi caso..

Por que no se por donde comenzar a buscar

Cronck

Hola creo que he encontrado algo mas

Veo que esos procesos que marca el Server-Status son procesos muertos que aun no ha soltado apache.

Estos procesos se van acumulto hasta que apache deja de responder..

creo que por ahi va mi asunto...

alguna idea?


MinusFour

Supongo que la lista de procesos va incrementando hasta que el apache ya no puede responder, por la limitación de MaxClients.

Lo del OPTIONS * HTTP/1.1 es del Internal Dummy Connection para revisar que los procesos están listos para escuchar nuevas peticiones.

https://wiki.apache.org/httpd/InternalDummyConnection

Dependiendo del modulo que estes usando para el multi-process, el servidor deja un maximo de procesos escuchando. Yo me imagino que tus respuestas del CGI tardan mucho en cerrarse y el servidor empieza a abrir procesos hasta que ya no puede y se satura el server.

Revisa los scripts que tengas funcionando con CGI no vaya a ser que se esten quedando colgados.

el-brujo

¿Apache o ngnix?

CitarTambién aumente los valores del nginx en el parametro fastcgi_buffer de 32 a 256

¿Apache para Windows o Linux?

Un error 503 es Error HTTP 503 Service unavailable (Servicio no disponible)

¿Cuál es tu directiva MaxClients en el fichero de configuración de Apache httpd.conf?

Revisa de nuevo el fichero error_log del apache y añade la directiva:

CitarLogLevel info

Por defecto es #LogLevel warn

Reinicia y mira de nuevo el error_log te dará pistas si faltan procesos del apache o cualquier otro problema.

En el server-status mira si tienes "idle workers" libres.

En teoría los procesos que tu dices que se quedan "pegados" durante mucho tiempo, mucho no puede ser, mira la directiva Timeout del httpd.conf

Por defecto son 300 segundos creo, mira de bajarlo un poco. Y los procesos tal y como te dicen OPTIONS * HTTP/1.0 son completamente normales.

En la captura que has puesto son proceos con un .

CitarScoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

Eso quiere decir:

CitarOpen slot with no current process

Si fuera un proceso "pegado" activo sería W o R

K, C aparcen con frecuencia pero duran apenas segundos

los procesos L sólo aparecen cuando hay problemas de rendimiento con el disco duro, y los G cuando reiniciamos el apache con la opción gracefully

Citar/usr/local/apache2/bin/apachectl -k graceful


Podrias mirar el número de conexiones en el puerto 80 para saber si hay alguna ip qu está haciendo demasiadas peticiones:

Citarnetstat -an | grep :80 | awk '{ print $5 }' | awk -F: '{ print $1 }' | sort | uniq -c | sort -n

Cronck

Muchas gracias MinusFour y a el-brujo por sus comentarios:

Voy a definir desde el principio.

el-brujo
Citar¿Apache o ngnix?
Es un servido que tiene instalado apache y usa ngninx como proxy de apache y es un Centos y usa el plesk para la administracion.

CitarEl servidor cuenta con 24 Cores y 24 GB en RAM

No he podido dar con el problema, pues de la nada deja de operar apache, y tengo que reinicar el servicio de apache.

Cuando se traba, solo aparece  servicio no disponible

ya realize el cambio en el httpd.conf, de warn a info y me ha estado arrojando estos warning:

Citar[Mon Jul 21 16:23:50 2014] [info] mod_fcgid: process /var/www/cgi-bin/cgi_wrapper/cgi_wrapper(6007) exit(lifetime expired), terminated by calling exit(), return code: 0
[Mon Jul 21 16:23:50 2014] [info] mod_fcgid: process /var/www/cgi-bin/cgi_wrapper/cgi_wrapper(6006) exit(lifetime expired), terminated by calling exit(), return code: 0
[Mon Jul 21 16:23:54 2014] [info] mod_fcgid: server xcaretexperiencias.com:/var/www/cgi-bin/cgi_wrapper/cgi_wrapper(6954) started
[Mon Jul 21 16:24:06 2014] [info] mod_fcgid: process /var/www/cgi-bin/cgi_wrapper/cgi_wrapper(6340) exit(lifetime expired), terminated by calling exit(), return code: 0
[Mon Jul 21 16:24:06 2014] [info] mod_fcgid: process /var/www/cgi-bin/cgi_wrapper/cgi_wrapper(6433) exit(lifetime expired), terminated by calling exit(), return code: 0
[Mon Jul 21 16:24:06 2014] [info] mod_fcgid: process /var/www/cgi-bin/cgi_wrapper/cgi_wrapper(6330) exit(lifetime expired), terminated by calling exit(), return code: 0
[Mon Jul 21 16:24:10 2014] [info] mod_fcgid: server en.xcaretexperiencias.com:/var/www/cgi-bin/cgi_wrapper/cgi_wrapper(7223) started
[Mon Jul 21 16:24:16 2014] [info] mod_fcgid: process /var/www/cgi-bin/cgi_wrapper/cgi_wrapper(6608) exit(lifetime expired), terminated by calling exit(), return code: 0
[Mon Jul 21 16:24:19 2014] [info] mod_fcgid: server pt.xcaretexperiencias.com:/var/www/cgi-bin/cgi_wrapper/cgi_wrapper(7390) started
[Mon Jul 21 16:24:23 2014] [info] mod_fcgid: server de.xcaretexperiencias.com:/var/www/cgi-bin/cgi_wrapper/cgi_wrapper(7467) started
[Mon Jul 21 16:24:23 2014] [info] mod_fcgid: server it.xcaretexperiencias.com:/var/www/cgi-bin/cgi_wrapper/cgi_wrapper(7469) started

el-brujo:
CitarEn el server-status mira si tienes "idle workers" libres.

Estos son los datos del service-status:
CitarCurrent Time: Monday, 21-Jul-2014 16:25:48 CDT
Restart Time: Monday, 21-Jul-2014 12:38:40 CDT
Parent Server Generation: 0
Server uptime: 3 hours 47 minutes 8 seconds
Total accesses: 518225 - Total Traffic: 761.7 MB
CPU Usage: u208.37 s87.88 cu0 cs0 - 2.17% CPU load
38 requests/sec - 57.2 kB/second - 1541 B/request
2 requests currently being processed, 53 idle workers

Estos son los valores que tengo anexado al httpd.conf
CitarTimeout 60
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule prefork.c>
StartServers       8
MinSpareServers   20
MaxSpareServers   60
ServerLimit      456
MaxClients       456
MaxRequestsPerChild  10000
</IfModule>

<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

y los valores del fcgid.conf es:

CitarLoadModule fcgid_module modules/mod_fcgid.so
<IfModule mod_fcgid.c>
<IfModule !mod_fastcgi.c>
    AddHandler fcgid-script fcg fcgi fpl
</IfModule>
  FcgidIPCDir /var/run/mod_fcgid/sock
  FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm

  FcgidIdleTimeout 90
  FcgidProcessLifeTime 30
  FcgidMaxProcesses 20
  FcgidMaxProcessesPerClass 8
  FcgidMinProcessesPerClass 0
  FcgidConnectTimeout 30
  FcgidIOTimeout 100
  FcgidInitialEnv RAILS_ENV production
  FcgidIdleScanInterval 10

</IfModule>


estuve monitoreando el numero de conexiones al puerto 80, y se mantiene muy estable:

el-brujo
Citarnetstat -an | grep :80 | awk '{ print $5 }' | awk -F: '{ print $1 }' | sort | uniq -c | sort -n

Citar5 187.232.202.137
      5 187.242.225.129
      5 200.56.194.104
      5 86.172.192.107
      6 0.0.0.0
      6 148.243.168.8
      6 187.147.191.105
      6 187.153.53.116
      6 187.164.56.118
      6 187.185.158.112
      6 187.209.93.195
      6 187.252.41.88
      6 189.129.202.201
      6 189.133.136.180
      6 189.144.41.253
      6 189.152.69.127
      6 189.163.93.29
      6 189.165.176.122
      6 189.189.75.119
      6 189.198.12.180
      6 189.200.56.211
      6 189.253.82.28
      6 189.254.19.194
      6 190.146.150.102
      6 201.103.136.9
      6 201.166.31.180
      6 54.92.93.227
      6 84.232.27.231
      7 177.228.82.167
      7 187.254.245.130
      7 201.172.180.125
      8 177.124.74.55
      9 187.157.41.2
      9 201.110.0.129
     10 187.194.92.67
     12 107.203.14.9
     12 118.130.162.70
     12 72.201.93.184
     13 38.88.230.130
     17 189.210.91.162

Realmente ya no se por donde buscarle
No logro dar con el problema del porque el apache deja de operar

Que recomiendan hacer?

MinusFour

¿Creo que estás usando prefork no? Yo digo que tienes tantos idle workers porque tu MaxSpareServers es 60 (apache mata el idle worker 61) y MinSpareServers es 20 (Apache tiene al menos 20 procesos escuchando nuevas peticiones). Prueba así:

MinSpareServers   10
MaxSpareServers   15

Cronck

De esta forma lo tenia por la mañana:

Citar<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      456
MaxClients       456
MaxRequestsPerChild  10000
</IfModule>

Pero me estubieron saliento estos mensajes en el error_log

Citar[Mon Jul 21 12:39:24 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 16 children, there are 15 idle, and 39 total children

si usa prefotk ni servidor

MinusFour

#8
Entonces yo creo que no te deberías preocupar por esos procesos. Si tienes alrededor de 40~ requests por segundo, yo creo que tener alrededor de 45 Max está bien. En el momento que pusiste cuantos idle workers tenías solo había 2 requests activos, estoy seguro que si sigues checando vas a notar como tienes menos idle workers.

Aún así, el problema no creo que este con estos procesos. Yo creo que tiene que ver con el CGI.

Edit: Tras buscar un poco, me di cuenta que estás usando SUExec, revisa el log de SUExec para ver si hay algún error por ahí. Los errores de SUExec aparentemente se muestran diferente en el log de apache (no es la verdadera causa de tu error).

Cronck

Nuevamente muchas gracias por el seguimiento

Les comento que estado monitoreando el comportamiento de apache, desde el dia lunes y hoy tuve un problema nuevamente y estoy tratando de entender el por que de la caida de mi sitio.

Bueno vamos al grano:

1.- estuve investigando y encontré que el parámetro MaxRequestsPerChild es el que controla el tiempo de actividad de cada proceso, el valor que tenia era de 10000 y al cumplirse ese plazo, los procesos pasaban al estado muerto (dead) tal como lo mostré en las imágenes anteriores.
Este parámetro lo baje a 4000 que es el que trae apache por default
Pero nuevamente al cumplirse ese tiempo la mitad de los procesos quedan muertos y se quedan ahi sin que apache los pueda eliminar

Espere mas tiempo para ver que pasaba cuando los procesos que estaban operando actualmente, al llegar al segundo ciclo, el sistema colapso y comenzó a arrojar errores mi sitio, de que no estaba accesible.

2.- Tengo unas incongruencias si este hecho fue un problema de los procesos que se quedaron pegados, o fue un tipo de sobre carga
la incongruencia viene por que encontre 2 hecho pegados, uno que se cumplia el ciclo nuevamente de los 4000 MaxRequestsPerChild y ademas encontre una ip con muchas visitas

Normalmente el sitio se estuvo comportando con esos valores de los idle workers y siempre se mantubo asi:



sobre el problema de hoy, me fije que los recuest eran mas que los idle workers
esta captura lo hice en el momento que fallo el sitio.



Lo que estaba mirando era que tenia muchos procesos ::1 {OPTIONS * HTTP/1.0} muertos en total contabilice 162:



Pero también encontré una IP que estaba generando muchas peticiones en ese preciso momento, en total encontré 76:



yo creo que el problema viene en que tengo mal configurado los valores de apache y cgi, pues casi cada tercer dia me pasa lo mismo, tengo que reinicar el motor de apache para que se estabilice.

Estos son los proceso de cgi:



Pero no se por donde comenzar a ajustar para llegar a lo optimo.
Que me recomiendan, tengo un buen servidor pero no lo tengo optimizado para la batalla.
Alguna idea?