Monitorizar un proceso Java

Últimamente he estado investigando un proceso Java que fallaba por falta de memoria y he visto unas cuantas técnicas de monitorización bastante útiles.

Los parámetros para el control de memoria de la máquina virtual Java se pueden ajustar por línea de comandos. Hay muchos parámetros disponibles, pero cabe destacar -Xms y -Xmx. Podéis consultar las opciones más importantes en la documentación oficial.

Para tener un volcado de la heap en caso de error, son muy útiles las opciones -XX:+HeapDumpOnOutOfMemoryError y -XX:HeapDumpPath=/dir.

Una opción muy potente de monitorización es usar JMX y conectarse mediante la JConsole, de esta forma podemos cambiar bastantes parámetros en caliente, como muestro en la imagen inferior.  Para habilitar JMX tenemos la opción -Dcom.sun.management.jmxremote.port=portNum y también tendremos que crear un usuario y contraseña como se describe en la documentación.

 

JConsole
JConsole

 

Otra opción de monitorización es habilitar el acceso SNMP, de esta forma nos es muy fácil acceder mediante Nagios o Cacti y tener un registro de lo que ha ido pasando en nuestro proceso Java. Podemos activar SNMP pasando los siguientes parámetros: -Dcom.sun.management.snmp.port=161 -Dcom.sun.management.snmp.interface=0.0.0.0

A continuación copiaremos el archivo de MIBs http://java.sun.com/javase/6/docs/jre/api/management/JVM-MANAGEMENT-MIB.mib como /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.txt. Además, para que funcione correctamente, tenemos que generar unas ACL y darle permisos de lectura solamente a root:

# cp /usr/lib/jvm/jre/lib/management/snmp.acl.template /usr/lib/jvm/jre/lib/management/snmp.acl
# chmod 0600 /usr/lib/jvm/jre/lib/management/snmp.acl

Editamos el fichero /usr/lib/jvm/jre/lib/management/snmp.acl y ponemos algo parecido a esto (sustituir localhost por las IPs/redes que nos interesen):

acl = {
  {
    communities = public, private
    access = read-only
    managers = localhost
  }
}

Para listar todos los parámetros que podemos consultar, podemos hacerlo con:

snmpwalk -m JVM-MANAGEMENT-MIB -v 2c -c public ip:puerto .

Existen unas plantillas para cacti muy buenas en este post: http://forums.cacti.net/viewtopic.php?t=23490

Podéis sacar más información en:

http://www.ninthavenue.com.au/blog/monitoring-the-jvm-with-snmp
http://www.latascadexela.es/2009/02/depurar-fugas-de-memoria-en-java-tomcat.html

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s