2012-09-07 22 views
6

Tengo un problema con mi servidor de producción actual que acaba de comenzar en los últimos días. Estoy ejecutando apache httpd-2.2.3 y tomcat-5.5.20, conectado con mod_jk v1.3, y tengo un sitio Spring MVC alojado en el tomcat. Lo que está sucediendo es que después de aproximadamente 12 horas de suspensión, el sitio web se cuelga para nuestros usuarios. Cuando esto sucedió por primera vez pude ver varios de los siguientes errores en el catalina.outmod_jk perdiendo conexión con tomcat

WARN [org.apache.jk.core.MsgContext] Error sending end packet 
java.net.SocketException: Broken pipe 

Después de mirar esto llegué a comprender que esto significaba que un usuario había cancelado una solicitud antes de que se había completado y por lo que el regreso el camino estaba cerrado, por lo tanto, los datos no podían volver atrás. Al buscar en la web, parecía que esto podría hacer que el hilo permaneciera abierto en tomcat hasta que alcanzara su tiempo de espera. Esto parecía tener sentido desde que llegué al final del registro catalina.out cuando el gato se cayó

All threads (200) are currently busy, waiting. Increase maxThreads (200) or check the servlet status 

La sugerencia fue hacer el siguiente cambio en la configuración de Apache httpd.conf JkModule

JkOptions +DisableReuse 

Lo hice después de asegurar que no causaba ningún efecto secundario en nuestro sitio y funcionó bien al día siguiente, pero ayer aparecieron los mismos síntomas con el sitio web congelado. Esta vez, sin embargo, no hubo ningún error en catalina.out, simplemente dejamos de recibir solicitudes para el tomcat. Puedo ver en el registro de aplicación que ha recibido la última solicitud a las 17:31, y luego en el mod_jk.log puedo ver la siguiente

[Thu Sep 06 17:37:07 2012] [18784:53792] [error] ajp_connection_tcp_get_message::jk_ajp_common.c (947): (worker1) can't receive the response message from tomcat, network problems or tomcat is down (127.0.0.1:8009), err=-104 
[Thu Sep 06 17:37:07 2012] [18784:53792] [error] ajp_get_reply::jk_ajp_common.c (1536): (worker1) Tomcat is down or refused connection. No response has been sent to the client (yet) 

y luego en mi error_log httpd

[Thu Sep 06 17:38:39 2012] [error] server reached MaxClients setting, consider raising the MaxClients setting 

Así que pasaron 6 minutos antes de que recibiera un error y después de eso pasaron 1 min. 30 antes del error máximo de clientes. Reiniciar el tomcat también solucionó este problema en particular.

No ha habido cambios en nuestra configuración de apache, tomcat o conector excepto la que mencioné (configuración actual a continuación) pero hemos realizado cambios en nuestro sitio para realizar más solicitudes de Ajax por usuario. Entonces, lo que me gustaría entender es cómo puedo analizar nuestro sistema para comprender cuáles son los cambios de configuración correctos que puedo hacer para garantizar que no sobrecargue nuestro servidor, pero evito que ocurra este problema.

Gracias Iain

configuración actual

httpd.conf

Timeout 300 
KeepAlive on 
MaxKeepAliveRequests 100 
KeepAliveTimeout 15 

LoadModule jk_module modules/mod_jk.so 
JkLogLevel error 
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " 
JkOptions  +ForwardKeySize +ForwardURICompat -ForwardDirectories +DisableReuse 

workers.properties

# Define 1 real worker using ajp13 
worker.list=worker1 
# Set properties for worker1 (ajp13) 
worker.worker1.type=ajp13 
worker.worker1.host=localhost 
worker.worker1.port=8009 
worker.worker1.lbfactor=50 
worker.worker1.cachesize=10 
worker.worker1.cache_timeout=600 
worker.worker1.socket_keepalive=1 
worker.worker1.recycle_timeout=300 

httpd-mpm.conf

StartServers   5 
MinSpareServers  5 
MaxSpareServers  10 
MaxClients   150 
MaxRequestsPerChild 0 

configuración de Tomcat son sólo la configuración de Tomcat estándar

+0

¿Consideró actualizarse a Tomcat 6/7? –

+0

No configuré la pila tecnológica y esperaba no tener que actualizar. Si se trata de eso, entonces puede ser algo para probar, pero tengo la sensación de que se puede arreglar con la configuración correcta – sparkdoo

Respuesta

2

Resulta que la respuesta era cambiar el tiempo de espera de mantenimiento de conexión. Todo lo que necesitaba para evitar que esto sucediera fue cambiar KeepAliveTimeout de 15 a 2 y agregar MaxRequestsPerChild de 5000.Encontré que esto detuvo este problema recurrente

Cuestiones relacionadas