Páginas

miércoles, 30 de noviembre de 2016

Monitorización y afinamiento del rendimiento de aplicaciones en Tomcat con JVisualVM

Para monitorizar el estado de un servidor Tomcat podemos utilizar dos herramientas que vienen incluídas en el JDK. JConsole y la mas moderna JVisualVM. Esta segunda agrupa las funcionalidades de varias herramientas habituales: jstat, jconsole, jstack, jmap e jinfo, acercándose mucho a la utilidad de una herramienta comercial de perfilado.

Vamos a centrarnos en comentar JConsole y JVisualVM.

Lo mas correcto a la hora de utilizar cualquiera de las dos herramientas es conectar con el servidor mediante JMX (Java Management Extensions) que es una especificación que define un mecanismo para ajustar aplicaciones y servicios en caliente. La monitorización mediante JMX es la menos intrusiva, se estima que ronda el 5% de sobrecarga.

Para monitorizar nuestro servidor mediante JMX tendremos que realizar los siguientes ajustes:

1) Paramos nuestro servidor Tomcat:

    $ /{tomcat-folder}/bin/shutdown.sh

2) Creamos (si no existe ya) el fichero /{tomcat-folder}/bin/setenv.sh con el siguiente contenido:

export JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

3) Rearrancamos nuestro servidor Tomcat:

    $ /{tomcat-folder}/bin/shutdown.sh

A la hora de monitorizar el servidor tomcat desde nuestro PC podremos levantar JConsole o JVisualVM, ambas herramientas están disponibles en el JDK:

1) Levantamos cualquiera de las herramientas


    $ /{jdk-folder}/bin/jconsole
    $ /{jdk-folder}/bin/jvisualvm

2) Definimos la conexión remota JMX, para lo que necesitaremos conocer la IP y el puerto del servidor, sería siempre algo así "127.0.0.1:9999".

  • JConsole. Connection / New Connection / Remote Process / <hostname>:<port>
  • JVisualVM. File /Add JMX Connection / <hostname>:<port>

Con esto ya deberíamos poder monitorizar nuestra JVM en producción o en pruebas de carga (lanzadas por ejemplo con JMeter) en preexplotación y observando la evolución de:

     Memoria Heap
     Memoria PermGen
     Threads
     Garbage Collector
     CPU utilizada
     Clases cargadas en memoria
     MBeans
     etc

Aunque para una monitorización básica de la JVM ambas herramientas son válidas, JVisualVM es mucho mas potente, dado que ofrece muchas de las características de herramientas comerciales de "profiling" (que se puede traducir como "perfilado", "afinamiento" o "puesta a punto") como JProfiler y YourKitdado. Con JVisualVM podremos "afinar" el rendimiento de nuestra aplicación:
  • Monitorizando el tiempo de CPU consumido por nuestras clases/paquetes durante una tanda de pruebas, detectando cuellos de botella o problemas de programación que impliquen tiempos de respuesta muy elevados.
  • Monitorizando la Memoria utilizada por nuestra aplicación, detectando que objetos aparecen con un frecuencia inesperada (posibles memory leaks), cual es el consumo de memoria de dichos objetos (posibles pool), etc.

Nota. JVisualVM se puede ampliar con muchos plugins, se puede integrar con Eclipse, es gratuíta, ...




No hay comentarios:

Publicar un comentario