Esta cuestión se trata aquí con gran detalle.
Cómo se mide el uso de memoria de una aplicación o proceso en Linux?
Desde el artículo del blog de Entender el uso de la memoria en Linux, ps
no es una herramienta precisa para usar en este intento.
Por qué
ps
es "incorrecto"Dependiendo de cómo se mire,
ps
no está informando del uso real de la memoria de los procesos. Lo que realmente hace es mostrar cuánta memoria real ocuparía cada proceso si fuera el único proceso en ejecución. Por supuesto, una máquina Linux típica tiene varias docenas de procesos ejecutándose en cualquier momento, lo que significa que los números VSZ y RSS reportados porps
son casi definitivamente equivocados.
Con ps
o herramientas similares sólo obtendrás la cantidad de páginas de memoria asignadas por ese proceso. Este número es correcto, pero:
no refleja la cantidad real de memoria utilizada por la aplicación, sólo la cantidad de memoria reservada para ella
puede ser engañoso si las páginas son compartidas, por ejemplo por varios hilos o por el uso de bibliotecas enlazadas dinámicamente
Si realmente quieres saber qué cantidad de memoria utiliza realmente tu aplicación, tienes que ejecutarla con un perfilador. Por ejemplo, valgrind
puede darte información sobre la cantidad de memoria utilizada y, lo que es más importante, sobre posibles fugas de memoria en tu programa. La herramienta de perfilado de heap de valgrind se llama 'massif':
Massif es un perfilador de heap. Realiza un detallado perfilado de la pila tomando instantáneas regulares de la pila de un programa. Produce un gráfico que muestra el uso de la pila a lo largo del tiempo, incluyendo información sobre qué partes del programa son responsables de la mayoría de las asignaciones de memoria. El gráfico se complementa con un archivo de texto o HTML que incluye más información para determinar dónde se está asignando más memoria. Massif ejecuta los programas unas 20 veces más lento de lo normal.
Como se explica en la documentación de valgrind, es necesario ejecutar el programa a través de valgrind:
valgrind --tool=massif <executable> <arguments>
Massif escribe un volcado de instantáneas de uso de memoria (por ejemplo, massif.out.12345
). Estos proporcionan, (1) una línea de tiempo del uso de la memoria, (2) para cada instantánea, un registro de dónde en su programa se asignó la memoria.
Una gran herramienta gráfica para analizar estos archivos es massif-visualizer. Pero he encontrado que ms_print
, una simple herramienta basada en texto que viene con valgrind, ya es de gran ayuda.
Para encontrar fugas de memoria, utilice la herramienta (por defecto) memcheck
de valgrind.
Es difícil decirlo con seguridad, pero aquí hay dos cosas "cercanas" que pueden ayudar.
$ ps aux
le dará el tamaño virtual (VSZ)
También puede obtener estadísticas detalladas del sistema de archivos /proc yendo a /proc/$pid/status
.
Lo más importante es el VmSize, que debería estar cerca de lo que da ps aux
.
pre>
/proc/19420$ cat status
Nombre: firefox
Estado: S (durmiendo)
Tgid: 19420
Pid: 19420
PPid: 1
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Grupos: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000
VmPeak: 222956 kB
VmSize: 212520 kB
VmLck: 0 kB
VmHWM: 127912 kB
VmRSS: 118768 kB
VmData: 170180 kB
VmStk: 228 kB
VmExe: 28 kB
VmLib: 35424 kB
VmPTE: 184 kB
Hilos: 8
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000020001000
SigCgt: 000000018000442f
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_permitidos: 03
Mems_permitidos: 1
interruptores_ctxt_voluntarios: 63422
interruptores_ctxt_no_voluntarios: 7171
Consigue valgrind. dale tu programa para que lo ejecute, y te dirá mucho sobre su uso de memoria.
Esto se aplicaría sólo para el caso de un programa que se ejecuta durante algún tiempo y se detiene. No sé si valgrind puede echar mano de un proceso ya ejecutado o de procesos que no deberían detenerse, como los demonios.