Análisis de thread dumps en WebLogic
03/03/2016 -
Hace unos meses escribí este post donde os explicaba qué son los stuck threads y cómo detectarlos. En el post de hoy os voy a presentar algunas herramientas que os pueden ser útiles para realizar el análisis de thread dumps, necesarios para la detección de stuck threads, deadlocks, etc.
Sin embargo, no hay que perder de vista el hecho de que como administradores únicamente podremos saber dónde está el problema, no solventarlo.
Ejecución de pruebas
Por si tenéis interés en realizar vuestras propias pruebas, aquí podéis encontrar una aplicación para provocar deadlocks, gentileza de nuestro compañero Àngel Ollé.
Una vez desplegada en una instancia WebLogic, se puede provocar un deadlock realizando peticiones a http://ip:puerto/DeadLockServlet/dl
Para generar stuck threads podéis utilizar la aplicación StuckThreadForFree realizando llamadas a http://ip:puerto/StuckThreadForFree sobre la instancia WebLogic.
Se definen cuántos threads levantar, cuántos segundos mantenerlos levantados y qué operación estarán ejecutando durante ese tiempo:
¿Qué herramienta utilizar?
Hay muchas herramientas en el mercado pero las más comúnmente utilizadas, que además son libres, son:
- Samurai
- Thread Dump Analyzer (TDA)
- ThreadLogic
Todas consisten en un JAR, por lo que su ejecución es tan simple como lanzar ‘java -jar <path fichero jar>’. La diferencia reside en cómo se muestra la información en la interfaz.
Una vez se ha iniciado la aplicación, abrimos el fichero de texto donde tenemos el thread dump.
Comentar que las aplicaciones pueden interpretar ficheros con varios thread dumps.
1. Samurai
Descarga: http://yusuke.homeip.net/samurai/en/samurai.jar
Es una aplicación muy intuitiva donde se identifican con facilidad bloqueos:
Si se clica sobre alguno de los threads, se muestra la información del thread en cada uno de los thread dumps del fichero de entrada:
Por lo que respecta a los stuck threads, esta aplicación no los detecta pero nos sirve para ver qué es lo qué está realizando el thread.
Los pasos a seguir serían:
- Abrir cada thread dump.
- Buscar la palabra STUCK en cada dump hasta encontrar un thread en este estado: en nuestro caso aparece el primer stuck thread en el dump 2.
- Pulsar sobre el thread para que se muestre el estado de ese thread en cada uno de los dumps.
Una vez tenemos identificado el thread podemos ver qué estaba ejecutando, que en nuestro caso es la función ‘threadCalc’ de la clase ‘com.munzandmore.stuckthread.LongRunningEJB’.
2. Thread Dump Analyzer (TDA)
Descarga: https://java.net/projects/tda/downloads
A diferencia de la aplicación anterior, ésta no muestra la información de una forma tan visual, aunque es igualmente identificable el estado de los diferentes threads:
Para cada una de las categorías podemos obtener el listado de threads y el extracto de los mismos.
Lo mismo para los deadlocks:
Así mismo, se puede obtener para cada objeto qué threads lo están utilizando:
Para encontrar los stuck threads se ha de abrir cada uno de los dumps y buscar la palabra STUCK, al igual que con Samurai.
La diferencia respecto la aplicación anterior es que al seleccionar un thread no se puede ver el stack para el thread en cada uno de los dumps.
Lo que sí se puede hacer es comparar dos thread dumps para detectar threads presentes en ambos:
3. ThreadLogic
En mi próximo post os hablaré de esta herramienta.