2012-06-01 17 views
6

Tengo una aplicación web que a menudo requiere una cantidad de tiempo desmesurada para implementarse en Tomcat. Mi sospecha es que hay una conexión de base de datos en algún lado que está esperando hasta que se agote el tiempo de espera, pero eso es solo una suposición y quiero averiguar con certeza qué está causando la suspensión para poder solucionar el problema. ¿Alguien puede sugerir una manera de hacerlo? ¿Debería perfilar Tomcat cuando está cargando la GUERRA y buscar pistas? Si es así, ¿hay algún tutorial en algún lugar que sea bueno para un principiante?¿Cómo puedo saber qué me ha llevado tanto tiempo desarrollar WAR en Tomcat?

En caso de que esto importe, mi aplicación web usa Spring e Hibernate. Un colega me ha dicho que tal vez esto está causando la desaceleración en el sentido de que son tan grandes que en algún lugar un cargador de clases se está ahogando en la gran cantidad de clases que necesita cargar.

también veo esto cuando deje de Tomcat o caliente desplegar el war a un Tomcat ya se está ejecutando:

Jun 1, 2012 6:03:33 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/nacem-rest] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
Jun 1, 2012 6:03:34 PM org.apache.catalina.startup.HostConfig deployWAR 

Tal vez esto es parte del problema? La redistribución de mi aplicación web casi siempre requiere el reinicio de Tomcat, y siempre he asumido que el problema del controlador JDBC mencionado anteriormente era el culpable, pero ¿quizás también tiene algo que ver con el lento tiempo de inicio?

Sé muy poco acerca de este tipo de cosas, así que esta es una verdadera oportunidad para aprender. Gracias de antemano por tu ayuda.

Respuesta

7

Puede usar un generador de perfiles, pero es un poco exagerado. En su lugar, solo haga algunos volcados de hilo mientras se carga la aplicación. Puede usar jstack o jvisualvm, con muchos recursos en la red que describen cómo hacerlo. Básicamente, necesita un PID de su Tomcat (consulte: jps).

Si le resulta difícil analizar el volcado de hilo, agréguelo a su pregunta. Por lo general, es bastante fácil encontrar un cuello de botella. Los problemas típicos:

  • la aplicación intenta obtener algún recurso de Internet como esquema XML
  • una gran cantidad de clases que deben analizarse en el CLASSPATH
  • GC excesiva (habilitar el registro de GC detallado por si acaso)
  • la memoria no es suficiente (el canje, ver iostat/iotop)
3

Usted debe tomar algunas hilo vertederos durante el despliegue (cuanto más mejor), y analizarlos. Busque bloques, esperas, etc. Thread Dump Analyzer podría ser de utilidad.

3

lo primero que vería es cómo el uso de CPU o RAM de tomcat se realiza durante el inicio de su aplicación.

Si ve mucha actividad de la CPU y RAM aumentar, entonces probablemente esté cargando muchas cosas, como muchas clases, o realizando algún tipo de gran preasignación o similar. En ese caso, los volcados de subprocesos pueden ayudarlo mucho, pero también "lsof" (si su tomcat se está ejecutando en un entorno * nix) para ver en qué archivos está trabajando actualmente.

Sin embargo, si lo ves simplemente sentado allí, entonces probablemente esté esperando algún tipo de conexión.

Una causa puede ser una conexión de base de datos, como suponía. La base de datos generalmente es rápida de responder, y un intento fallido de conectarse a una base de datos suele estar claramente registrado en alguna parte, pero aún así podría ser.

Otra causa menos conocida es la validación de XML. No es raro que una aplicación web cargue algunos datos XML, y no es raro usar un analizador de validación para cargar ese XML. El analizador de validación necesita un esquema o DTD para validar, y la URL para el archivo de esquema/DTD a menudo se incluye en el XML. Por lo tanto, algunos analizadores intentarán cargar el archivo de esquema desde Internet para validar el XML, y eso podría tomar mucho tiempo en ser una conexión a Internet. Además, algunos analizadores fallan silenciosamente y simplemente no validan el XML, probablemente después de un tiempo de espera bastante largo. Lo siento por ser vago en "algunos analizadores sintácticos", etc., pero si la carga de XML se realiza mediante bibliotecas usadas dentro de su aplicación web, podrían usar el analizador JVM XML, cualquier versión posible de Xerces, cualquier versión posible para JDOM, etc. ... e incluso las peores bibliotecas diferentes pueden estar usando analizadores diferentes.

Sin embargo, si se trata de un problema de conexión, es más fácil verlo usando "netstat -anlp | grep java" (en su tomcat está en un entorno * nix, de lo contrario debería ser "netstat -ano" en windows) , y buscando qué conexión saliente está tratando de hacer tu gato. Allí puede ver las conexiones DB y también las conexiones salientes (generalmente http) buscando esquemas u otras cosas.

4

Si está utilizando Tomcat 7.0.x, podría estar escaneando el classpath para detectar anotaciones. Si tiene muchos jarras/clases, esto puede ser un problema.

Como dice Simone, tomar y analizar un par de vuelcos de hilo es una buena forma de comenzar.

Si no está utilizando una versión reciente de Tomcat, intente actualizar & revisando el archivo conf/catalina.properties para obtener sugerencias sobre cómo reducir el número de jarras que se escanean.

0

Descubrí que tuve un gran retraso al implementar una aplicación web en Tomcat8. Tenía tres grupos de conexión de base de datos configurados en mi archivo context.xml dentro de WAR. Cada grupo de conexiones tenía un recuento inicial de 10 conexiones, por lo que Tomcat estaba creando 30 conexiones de base de datos al inicio. Descubrí que configurar cada grupo para 1 conexión inicial en mi sistema de prueba mejoró el tiempo de implementación de aproximadamente 3 minutos a 22 segundos.

-3

Anexar a continuación en setenv.sh de su tomcat7/bin directorio de trabajo:

JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

Cuestiones relacionadas