Foros del Web » Administración de Sistemas » Apache »

Matar childs eternos

Estas en el tema de Matar childs eternos en el foro de Apache en Foros del Web. Buenas, aunque llevo mucho tiempo leyéndoos, ahora me he registrado para ver si podéis ayudarme con un tema. Lo primero, el servidor. Ordenador doméstico corriendo ...
  #1 (permalink)  
Antiguo 11/12/2009, 03:17
 
Fecha de Ingreso: diciembre-2009
Mensajes: 2
Antigüedad: 14 años, 11 meses
Puntos: 0
Matar childs eternos

Buenas, aunque llevo mucho tiempo leyéndoos, ahora me he registrado para ver si podéis ayudarme con un tema.

Lo primero, el servidor. Ordenador doméstico corriendo sin problemas con Win XP+Apache 2.2.13+Oracle un juego online que entrega entre 200.000 y 300.000 páginas diarias, con un tiempo de entrega de página inferior al medio segundo en prácticamente todos los casos. 60 procesos worker de Apache, de los que no suelen estar en uso más de 5 simultáneamente. URL http://asturcon3.homeip.net/ogarena

El tema que me ocupa es que muy de vez en cuando (digamos una vez al mes)hay algún problema esporádico en la base de datos que motiva tiempos altos de respuesta y posiblemente una cancelación de la operación por exceso de tiempo.

En esta situación, algunos procesos del Apache se quedan como bloqueados como se puede ver en el server-status, en estado W (Sending Reply) y durante todo el tiempo que reste hasta el siguiente reseteo diario programado. Vaya, que se quedan ahí acumulando segundos y sin hacer nada.

Varias veces he investigado este tema con resultados bastante... inexistentes. Por lo que he podido ver, el problema es que el proceso de apache intenta ejecutar la petición que sea y se queda esperando hasta que la base de datos aborta el proceso, cosa que se detecta en el PHP y se saca el mensaje de error apropiado. Pero si el navegador de quien pidió la página ya no está esperando (por ejemplo porque el usuario se dedica a recargar con F5 en cuanto una página tarda más de 3 segundos en cargar) entonces el proceso se queda en ese estado tonto de intentar enviar una respuesta a un cliente que ya no está esperándola.

Obviamente, tengo la directiva timeout 60 en la configuración, pero no se aplica en este estado. Sólo vale cuando el proceso está procesando algo, no cuando está enviando la respuesta final.

Bueno, ayer por la tarde hubo un incidente de estos y hoy me he encontrado 50 de los 60 procesos de apache bloqueados de este modo. Un poco más, y la web habría caído. Así que he vuelto a mirar un poco.

Y me he encontrado el módulo mod-perl, que teniendo activo el scoreboard permite activar Apache::Watchdog::RunAway::TIMEOUTseconds, que tiene toda la pinta de ser justo lo que quiero: Si un proceso tarda más de x segundos en el estado que sea, que lo mate.

Pero ni tengo instalado ese módulo ni tengo mayor intención de liarme a instalar (y posteriormente mantener) toda la parafernalia dependiente sólo para esto... que bien podría ser configurable nativamente en Apache.

Tanto me parece que un timeout global del child debería ser una directiva o algo igual de simple, que me he registrado y escrito todo esto.

Así que... ¿alguien me puede dar alguna pista?
  #2 (permalink)  
Antiguo 11/12/2009, 14:50
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Matar childs eternos

Que lenguaje estas usando, me refiero PHP, ASP o algún otro. Porque a mi entender el problema esta en la forma como haces la consulta en la base de datos. Esto entonces debe ser el lenguaje que uses de programación.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 12/12/2009, 13:03
 
Fecha de Ingreso: diciembre-2009
Mensajes: 2
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Matar childs eternos

Cita:
Iniciado por asturcon3 Ver Mensaje
...cosa que se detecta en el PHP...
Y las consultas, mediante ociexecute sobre una conexión permanente (por ese motivo tengo limitados el número de childs de Apache)

Pero las consultas a base de datos terminan. Si cuando tengo childs de apache colgados consulto las sesiones activas en la base de datos, ninguna se corresponde.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:00.