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?