Me gustaría realizar un seguimiento de la cantidad de memoria que tocan varios programas en estados específicos. Por ejemplo, digamos que tengo un programa gráfico. Podría usar sustancialmente menos memoria cuando se minimiza, ya que no volverá a dibujar la ventana, lo que requiere leer imágenes y fuentes y ejecutar una gran cantidad de funciones de la biblioteca. Aún se puede acceder a estos objetos en la memoria, pero en realidad no se están utilizando.Seguimiento de la memoria utilizada activamente en los programas de Linux
Las herramientas como top
son de uso limitado, ya que solo indican la cantidad de memoria asignada en el espacio de direcciones de un programa y la cantidad de memoria residente en la memoria RAM física. Del mismo modo, los detectores de fugas solo indicarán cuándo la memoria es inaccesible, no si solo no se está utilizando.
¿Existe alguna herramienta que pueda rastrear de esta forma la memoria usada/no utilizada activamente? Si es posible, me gustaría hacer un seguimiento del uso no solo en el montón, sino también en el almacenamiento de la memoria del programa/código de la biblioteca.
EDIT: me gustaría aclarar: Quiero saber mucho la cantidad de memoria un programa realmente lee, escribe, o ejecuta después de cierto punto, es decir, una vez que se alcanza un determinado estado. Si bien el número de páginas en el espacio de direcciones y el número de páginas residentes son medidas importantes, esto no es lo que estoy buscando.
estoy persiguiendo tres enfoques en este momento:
- He escrito una biblioteca que borra todos los bits de protección de las regiones de memoria (excepto la pila y su propio código) leer de/proc/self/mapas usando `mprotect`. Tiene un controlador segfault que restaura los bits de protección e incrementa un contador. Lo cargo con `LD_PRELOAD` y comienza a rastrear el acceso a la memoria al recibir una señal. Esto ha producido algunas fallas genuinas con direcciones aparentemente falsas (no se almacenan en ningún registro o memoria cercana en el momento de la falla).
- He escrito un programa `purge` que asigna y lee de memoria usando` mmap` hasta que `mmap` devuelve un error. Esto, con suerte, obliga a todas las páginas del proceso de destino, que se suspende mientras `purge` se está ejecutando. Luego cuento el número de entradas de página cuando se reanuda el proceso objetivo, usando `pidstat`. Esto parece funcionar, pero es un instrumento muy contundente. No proporciona ninguna información sobre qué páginas fueron tocadas.
- Me han dicho que valgrind le permite escribir complementos que hacen que se ejecuten ciertas acciones en ciertos eventos, por ejemplo, acceso a la memoria. Esto parece prometedor hasta ahora.
duplicado: http://stackoverflow.com/questions/131303/linux-how-to-measure-actual -memory-usage-of-an-application-or-process – lothar