Tomcat

Apache Tomcat es el contenedor de servlets más utilizado a día de hoy. Y también es un de los más criticados. En ocasiones se queda bloqueado y deja de dar servicio. Aquí voy a intentar dar mi experiencia con este servidor e intentar desvelar porqué se queda bloqueado y demás problemas que surgen. Ya adelanto que el entorno de Tomcat es más complejo que por ejemplo Apache con PHP, Python o Perl, por lo que es normal que sea más complejo su manejo ... aunque quizá lo sea demasiado. Tengo la impresión de que mimando Tomcat puede llegar a ser muy robusto.

Problemas de memoria

Uno de los problemas más habituales es que se que se quede sin memoria. En este caso el proceso de Tomcat no hay forma de pararle de forma elegante, hasta donde sé, y me obliga a hacer un "kill -9" (señal que no deja al proceso guardar nada y lo finalizad el núcleo). Tomcat se ejecuta por encima de la máquina virtual (VM) de Java y es esta la que le asigna memoria, de aquella que la máquina virtual tenga disponible. Si empieza a escasear la memoria la VM entra en modo de recolección de basura (GC) y se dedica más tiempo a liberar memoria que a dar servicio. Si no es posible liberar suficiente memoria la máquina virtual se queda como congelada utilizando toda la CPU y Tomcat deja de responder.

Para evitar estos problemas se le puede indicar a la máquina virtual Java que coja más memoria que la que hace por defecto:

acs2@rayito:~$ java -X | grep size
    -Xms<size>        set initial Java heap size
    -Xmx<size>        set maximum Java heap size
    -Xss<size>        set java thread stack size

Por ejemplo el Liferay he tenido problemas si pongo -Xmx a 512m que se han resuelto al poner -Xmx 1024m, que es 1GB de memoria, que no deja de ser un montón.

Otro de los problemas que he sufrido ya desde el principio con Tomcat+Eclipse (creo que eclipse está redesplegando las aplicaciones a menudo sobre Tomcat) es el famoso "PermGen OutOfMemoryError" que indica que la máquina virtual se ha quedado sin memoria permanente, que es donde por ejemplo se meten las clases. Hay muchas discusiones al respecto y varias propuestas de soluciones. Una que he visto a menudo y que he aplicado ha sido la de aumentar el tamaño para esta memoria con "-XX:MaxPermSize=256m". Aquí se cuentan cosas más elaboradas.

Lanzar Tomcat con java en modo servidor

Interesante lo que comentan en la lista de usuarios de Tomcat sobre lanzar java en modo servidor. Es tan sencillo como ejecutar "java -server" con lo que la máquina virtual adopta una configuración de servidor.

JConsole para monitorizar lo que ocurre en la máquina virtual

A partir de la versión 5 JDK trae una herramienta llamada JConsole que nos permite ver la evolución de la máquina virtual Java si está en modo "managed". Para esto es necesario añadir en la línea de comandos al ejecutar Tomcat "java -Dcom.sun.management.jmxremote". Muestra información de todo tipo sobre la ejecución del proceso: uso de memoria, hebras, clases cargadas, información sobre el sistema operativo y recursos disponibles ... podemos ir ejecutando por ejemplo Liferay e ir viendo como evoluciona el uso de memoria. Y será interesante si se queda colgado Tomcat para saber porque ha sido.

Monitorizar Tomcat

Howto configure OpenNMS to collect performance data from a tomcat 5.5 servlet container.

Tomcat (last edited 2009-04-20 09:52:52 by localhost)