Lo primero, encontrar algo con lo cual medir la memoria del proceso que deseamos monitorizar. Podemos utilizar top pero buscaba algo más, y me encontré este script en Python.
Lo ejecutamos y nos mostrará el consumo de memoria de cada proceso.
A continuación necesitamos ejecutarlo en intervalos regulares y procesar el único dato que buscamos, en este caso, la memoria utilizada por el proceso Java y para lo cual, escribimos un pequeño script
#!/bin/bash
while true; do
sleep 30;
X=$(./mem_info.py | grep java | awk '{ print $7 }');
echo $(date +%s) " " $X >>/tmp/mem_usage.dat;
done
Ahora cambiamos permisos y ejecutamos en background (&). Este script generará cada 30 segundo una línea con dos columnas, la fecha en formato UNIX (1234567890) y el consumo de memoria de todos los procesos java.
Esto en el servidor donde se ejecuta el programa. A continuación en mi estación de trabajo, instalo el único paquete necesario para todo esto que no viene instalado por defecto en Ubuntu, Gnuplot el cual será el encargado de dibujar las gráficas con los datos que le iremos proporcionando.
$sudo aptitude install gnuplot
Ahora vamos a hacer otro script en nuestra máquina para traer el fichero, formatearlo como lo deseamos, crear el gráfico y mostrarlo.
#!/bin/bash
DATA=/tmp/mem_usage.dat
TMPDATA=/tmp/meminfo2.dat
PLOTSCRIPT=/tmp/myplot.gp
echo Buscando el fichero de datos
scp foo@bar:$DATA /tmp/
echo Cambiando fecha por numeros
X=1;
while read line; do
X=$(( $X + 1 ));
echo $X ${line#*\ };
done < $DATA > $TMPDATA
echo Creando Script para Gnuplot
echo "set terminal png" > $PLOTSCRIPT
echo "set output \"/tmp/mem_usage.png\"" >> $PLOTSCRIPT
echo "plot \"$TMPDATA\" title \"Memoria MB\" with steps" >> $PLOTSCRIPT
echo Drawing
gnuplot $PLOTSCRIPT
eog /tmp/mem_usage.png &
El resultado final es el siguiente:
El primer script continua ejecutándose indefinidamente en el servidor y cuando quiera, ejecuto el segundo script y puedo ver como va evolucionando el consumo de la memoria.
Nota: Tengo instalado el Profiler para Java de Eclipse y gracias a esto fue como resolví el problema de la memoria en la aplicación (un proceso dentro de JBoss) pero de igual manera quería ver como se comportaba la memoria del sistema y no pelearme con algún profiler para JBoss.
Nota 2: El consumo de memoria de la JVM es bastante complejo, por lo que puede que las lecturas no sean las reales del consumo de la aplicación (de hecho no lo son), pero dado que
existía un overflow y la memoria se consumía poco a poco, con ver la memoria del sistema podía saber si estaba o no solucionado el problema.
No hay comentarios:
Publicar un comentario