Gráficos del uso de memoria en Linux

Que fácil es hacer las cosas más complicadas con Linux. Tengo que monitorizar el consumo de memoria de una aplicación Java que por alguna razón estaba haciendo un overflow. Al final lo resolví, pero quería comprobarlo de una manera rápida y sencilla.
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.