viernes, febrero 22, 2013

Algunas notas rápidas de valgrind (III): Análisis de uso de memoria dinámica

Valgrind tiene una herramienta que permita analizar el consumo de memoria dinámica que realiza un programa,analizando el heap del mismo. Esta herramienta es massif. Para realizar el perfilado de un programa usando dicha herramienta hay que ejecutarlo bajo valgrind con los siguientes parámetros:


valgrind --tool=massif programa arg1 arg2 ....

Una vez que acabe la ejecución del programa bajo valgrind, se generará un fichero en el directorio desde donde se ha lanzando massif.out.pid, siendo pid el que el sistema le ha asignado al proceso para su identificación. Aunque el formato de este fichero es de texto, es mejor usar alguna utilidad que obtenga la información del mismo, dándonos una representación gráfica de los resultados obtenidos.

Una primera utilidad para obtener dicha representación es ms_print,incluido en el propio valgrind, que nos sacará un gráfica en modo texto de cual ha sido el patrón de uso de memoria dinámica que ha usado el mismo. Esta manera de sacar la información no es muy práctica, es mucho más útil usar un programa gráfico como Massif Visualizer, para el entorno KDE.

Con Massif Visualizer es sencillo encontrar aquellas zonas del programa que están haciendo más uso de memoria dinámica, incluyendo la traza de la pila que lleva a ese consumo.

Sin embargo, hay que tener en cuenta donde massif se engancha para medir memoria: malloc,calloc y compañeros, pero no se engancha en algunas llamadas básicas sobre las cuales están construidas las anteriores como mmap o brk. Para poder medir la cantidad de memoria reservada a través de estas funciones es necesario usar el argumento --pages-as-heap=yes. Otras dos opciones importantes de configurar es el número de instantáneas detalladas que el programa capturará durante la ejecución y la frecuencia con la que éstas instantáneas son realizadas. El parámetro --detailed-freq=n - n por defecto 10 - nos dice del total de instantáneas, de cuantas se guardará información detalla. Si este valor es 10, significa que de 1 de cada 10 se almacenará información. Para almacenar información de todas, hay que darle el valor 1. El argumento --max-snapshots=n, para indicar el número de instantáneas que dejaremos almacenada. Si aumentamos estos números, la ejecución de valgrind necesitará de más recursos.



Technorati Tags:

No hay comentarios: