Pregunta

Esta pregunta está cubierta aquí en gran detalle.

¿Cómo se mide el uso de memoria de una aplicación o proceso en Linux?

Del artículo de blog de Comprensión del uso de memoria en Linux , ps no es una herramienta precisa para usar con este propósito.

  

Por qué ps está " incorrecto "

     

Dependiendo de cómo lo mire, ps no informa el uso de memoria real de los procesos. Lo que realmente está haciendo 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 un momento dado, lo que significa que los números VSZ y RSS informados por ps son casi definitivamente incorrectos .

¿Fue útil?

Solución

Con ps o herramientas similares solo obtendrá 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, solo la cantidad de memoria reservada para ella

  • puede ser engañoso si las páginas se comparten, por ejemplo, por varios hilos o mediante el uso de bibliotecas vinculadas dinámicamente

Si realmente desea saber qué cantidad de memoria utiliza realmente su aplicación, debe ejecutarla dentro de un generador de perfiles. Por ejemplo, valgrind puede brindarle información sobre la cantidad de memoria utilizada y, lo que es más importante, sobre las posibles pérdidas de memoria en su programa. La herramienta de perfil de montón de valgrind se llama 'macizo':

  

Massif es un generador de perfiles de montón. Realiza perfiles detallados de almacenamiento dinámico tomando instantáneas regulares del almacenamiento dinámico de un programa. Produce un gráfico que muestra el uso del montón a lo largo del tiempo, que incluye 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 asigna la mayor cantidad de memoria. Massif ejecuta programas aproximadamente 20 veces más lento de lo normal.

Como se explica en la documentación de valgrind , debe 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 se asignó la memoria de su programa. Una gran herramienta gráfica para analizar estos archivos es massif-visualizer . Pero encontré que ms_print , una herramienta simple basada en texto que se envía con valgrind, ya es de gran ayuda.

Para encontrar pérdidas de memoria, use la herramienta memcheck (predeterminada) de valgrind.

Otros consejos

Pruebe el pmap comando:

sudo pmap -x <process pid>

Es difícil saberlo con certeza, pero aquí hay dos "cerrar" cosas que pueden ayudar.

$ ps aux 

le dará 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 debe estar cerca de lo que ps aux ofrece.

/proc/19420$ cat status
Name:   firefox
State:  S (sleeping)
Tgid:   19420
Pid:    19420
PPid:   1
TracerPid:  0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 256
Groups: 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
Threads:    8
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000020001000
SigCgt: 000000018000442f
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed:   03
Mems_allowed:   1
voluntary_ctxt_switches:    63422
nonvoluntary_ctxt_switches: 7171

En versiones recientes de Linux, use el subsistema smaps . Por ejemplo, para un proceso con un PID de 1234:

cat /proc/1234/smaps

Le dirá exactamente cuánta memoria está usando en ese momento. Más importante aún, dividirá la memoria en privada y compartida, para que pueda saber cuánta memoria está usando su instancia del programa, sin incluir la memoria compartida entre múltiples instancias del programa.

No hay una manera fácil de calcular esto. Pero algunas personas han tratado de obtener algunas buenas respuestas:

Utilice smem , que es una alternativa a ps que calcula el USS y el PSS por proceso. Lo que quieres es probablemente el PSS.

  • USS : tamaño de conjunto único. Esta es la cantidad de memoria no compartida única para ese proceso (piense en ella como U para la memoria única ). No incluye memoria compartida. Por lo tanto, esto debajo de informará la cantidad de memoria que utiliza un proceso, pero es útil cuando desea ignorar la memoria compartida.

  • PSS : tamaño de conjunto proporcional. Esto es lo que quieres. Agrega la memoria única (USS), junto con una proporción de su memoria compartida dividida por el número de otros procesos que comparten esa memoria. Por lo tanto, le dará una representación precisa de cuánta memoria física real se está utilizando por proceso, con la memoria compartida realmente representada como compartida. Piense en el P ser para la memoria física .

Cómo se compara con RSS según lo informado por ps y otras utilidades:

  • RSS : tamaño de conjunto residente. Esta es la cantidad de memoria compartida más memoria no compartida utilizada por cada proceso. Si alguno de los procesos comparte memoria, esto sobre -reportará la cantidad de memoria realmente utilizada, porque la misma memoria compartida se contará más de una vez- apareciendo nuevamente en otro proceso que comparte la misma memoria. Por lo tanto, es bastante poco confiable, especialmente cuando los procesos de alta memoria tienen muchos forks, lo cual es común en un servidor, con procesos como Apache o PHP (fastcgi / FPM).

Aviso: smem también puede (opcionalmente) generar gráficos como gráficos circulares y similares. OMI, no necesitas nada de eso. Si solo quiere usarlo desde la línea de comandos como si usara ps -A v, entonces no necesita instalar la dependencia recomendada de python-matplotlib.

ps -eo size,pid,user,command --sort -size | \
    awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\
    cut -d "" -f2 | cut -d "-" -f1

Use esto como root y puede obtener una salida clara para el uso de memoria en cada proceso.

EJEMPLO DE SALIDA:

     0.00 Mb COMMAND 
  1288.57 Mb /usr/lib/firefox
   821.68 Mb /usr/lib/chromium/chromium 
   762.82 Mb /usr/lib/chromium/chromium 
   588.36 Mb /usr/sbin/mysqld 
   547.55 Mb /usr/lib/chromium/chromium 
   523.92 Mb /usr/lib/tracker/tracker
   476.59 Mb /usr/lib/chromium/chromium 
   446.41 Mb /usr/bin/gnome
   421.62 Mb /usr/sbin/libvirtd 
   405.11 Mb /usr/lib/chromium/chromium 
   302.60 Mb /usr/lib/chromium/chromium 
   291.46 Mb /usr/lib/chromium/chromium 
   284.56 Mb /usr/lib/chromium/chromium 
   238.93 Mb /usr/lib/tracker/tracker
   223.21 Mb /usr/lib/chromium/chromium 
   197.99 Mb /usr/lib/chromium/chromium 
   194.07 Mb conky 
   191.92 Mb /usr/lib/chromium/chromium 
   190.72 Mb /usr/bin/mongod 
   169.06 Mb /usr/lib/chromium/chromium 
   155.11 Mb /usr/bin/gnome
   136.02 Mb /usr/lib/chromium/chromium 
   125.98 Mb /usr/lib/chromium/chromium 
   103.98 Mb /usr/lib/chromium/chromium 
    93.22 Mb /usr/lib/tracker/tracker
    89.21 Mb /usr/lib/gnome
    80.61 Mb /usr/bin/gnome
    77.73 Mb /usr/lib/evolution/evolution
    76.09 Mb /usr/lib/evolution/evolution
    72.21 Mb /usr/lib/gnome
    69.40 Mb /usr/lib/evolution/evolution
    68.84 Mb nautilus
    68.08 Mb zeitgeist
    60.97 Mb /usr/lib/tracker/tracker
    59.65 Mb /usr/lib/evolution/evolution
    57.68 Mb apt
    55.23 Mb /usr/lib/gnome
    53.61 Mb /usr/lib/evolution/evolution
    53.07 Mb /usr/lib/gnome
    52.83 Mb /usr/lib/gnome
    51.02 Mb /usr/lib/udisks2/udisksd 
    50.77 Mb /usr/lib/evolution/evolution
    50.53 Mb /usr/lib/gnome
    50.45 Mb /usr/lib/gvfs/gvfs
    50.36 Mb /usr/lib/packagekit/packagekitd 
    50.14 Mb /usr/lib/gvfs/gvfs
    48.95 Mb /usr/bin/Xwayland :1024 
    46.21 Mb /usr/bin/gnome
    42.43 Mb /usr/bin/zeitgeist
    42.29 Mb /usr/lib/gnome
    41.97 Mb /usr/lib/gnome
    41.64 Mb /usr/lib/gvfs/gvfsd
    41.63 Mb /usr/lib/gvfs/gvfsd
    41.55 Mb /usr/lib/gvfs/gvfsd
    41.48 Mb /usr/lib/gvfs/gvfsd
    39.87 Mb /usr/bin/python /usr/bin/chrome
    37.45 Mb /usr/lib/xorg/Xorg vt2 
    36.62 Mb /usr/sbin/NetworkManager 
    35.63 Mb /usr/lib/caribou/caribou 
    34.79 Mb /usr/lib/tracker/tracker
    33.88 Mb /usr/sbin/ModemManager 
    33.77 Mb /usr/lib/gnome
    33.61 Mb /usr/lib/upower/upowerd 
    33.53 Mb /usr/sbin/gdm3 
    33.37 Mb /usr/lib/gvfs/gvfsd
    33.36 Mb /usr/lib/gvfs/gvfs
    33.23 Mb /usr/lib/gvfs/gvfs
    33.15 Mb /usr/lib/at
    33.15 Mb /usr/lib/at
    30.03 Mb /usr/lib/colord/colord 
    29.62 Mb /usr/lib/apt/methods/https 
    28.06 Mb /usr/lib/zeitgeist/zeitgeist
    27.29 Mb /usr/lib/policykit
    25.55 Mb /usr/lib/gvfs/gvfs
    25.55 Mb /usr/lib/gvfs/gvfs
    25.23 Mb /usr/lib/accountsservice/accounts
    25.18 Mb /usr/lib/gvfs/gvfsd 
    25.15 Mb /usr/lib/gvfs/gvfs
    25.15 Mb /usr/lib/gvfs/gvfs
    25.12 Mb /usr/lib/gvfs/gvfs
    25.10 Mb /usr/lib/gnome
    25.10 Mb /usr/lib/gnome
    25.07 Mb /usr/lib/gvfs/gvfsd 
    24.99 Mb /usr/lib/gvfs/gvfs
    23.26 Mb /usr/lib/chromium/chromium 
    22.09 Mb /usr/bin/pulseaudio 
    19.01 Mb /usr/bin/pulseaudio 
    18.62 Mb (sd
    18.46 Mb (sd
    18.30 Mb /sbin/init 
    18.17 Mb /usr/sbin/rsyslogd 
    17.50 Mb gdm
    17.42 Mb gdm
    17.09 Mb /usr/lib/dconf/dconf
    17.09 Mb /usr/lib/at
    17.06 Mb /usr/lib/gvfs/gvfsd
    16.98 Mb /usr/lib/at
    16.91 Mb /usr/lib/gdm3/gdm
    16.86 Mb /usr/lib/gvfs/gvfsd
    16.86 Mb /usr/lib/gdm3/gdm
    16.85 Mb /usr/lib/dconf/dconf
    16.85 Mb /usr/lib/dconf/dconf
    16.73 Mb /usr/lib/rtkit/rtkit
    16.69 Mb /lib/systemd/systemd
    13.13 Mb /usr/lib/chromium/chromium 
    13.13 Mb /usr/lib/chromium/chromium 
    10.92 Mb anydesk 
     8.54 Mb /sbin/lvmetad 
     7.43 Mb /usr/sbin/apache2 
     6.82 Mb /usr/sbin/apache2 
     6.77 Mb /usr/sbin/apache2 
     6.73 Mb /usr/sbin/apache2 
     6.66 Mb /usr/sbin/apache2 
     6.64 Mb /usr/sbin/apache2 
     6.63 Mb /usr/sbin/apache2 
     6.62 Mb /usr/sbin/apache2 
     6.51 Mb /usr/sbin/apache2 
     6.25 Mb /usr/sbin/apache2 
     6.22 Mb /usr/sbin/apache2 
     3.92 Mb bash 
     3.14 Mb bash 
     2.97 Mb bash 
     2.95 Mb bash 
     2.93 Mb bash 
     2.91 Mb bash 
     2.86 Mb bash 
     2.86 Mb bash 
     2.86 Mb bash 
     2.84 Mb bash 
     2.84 Mb bash 
     2.45 Mb /lib/systemd/systemd
     2.30 Mb (sd
     2.28 Mb /usr/bin/dbus
     1.84 Mb /usr/bin/dbus
     1.46 Mb ps 
     1.21 Mb openvpn hackthebox.ovpn 
     1.16 Mb /sbin/dhclient 
     1.16 Mb /sbin/dhclient 
     1.09 Mb /lib/systemd/systemd 
     0.98 Mb /sbin/mount.ntfs /dev/sda3 /media/n0bit4/Data 
     0.97 Mb /lib/systemd/systemd 
     0.96 Mb /lib/systemd/systemd 
     0.89 Mb /usr/sbin/smartd 
     0.77 Mb /usr/bin/dbus
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.74 Mb /usr/bin/dbus
     0.71 Mb /usr/lib/apt/methods/http 
     0.68 Mb /bin/bash /usr/bin/mysqld_safe 
     0.68 Mb /sbin/wpa_supplicant 
     0.66 Mb /usr/bin/dbus
     0.61 Mb /lib/systemd/systemd
     0.54 Mb /usr/bin/dbus
     0.46 Mb /usr/sbin/cron 
     0.45 Mb /usr/sbin/irqbalance 
     0.43 Mb logger 
     0.41 Mb awk { hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" } 
     0.40 Mb /usr/bin/ssh
     0.34 Mb /usr/lib/chromium/chrome
     0.32 Mb cut 
     0.32 Mb cut 
     0.00 Mb [kthreadd] 
     0.00 Mb [ksoftirqd/0] 
     0.00 Mb [kworker/0:0H] 
     0.00 Mb [rcu_sched] 
     0.00 Mb [rcu_bh] 
     0.00 Mb [migration/0] 
     0.00 Mb [lru
     0.00 Mb [watchdog/0] 
     0.00 Mb [cpuhp/0] 
     0.00 Mb [cpuhp/1] 
     0.00 Mb [watchdog/1] 
     0.00 Mb [migration/1] 
     0.00 Mb [ksoftirqd/1] 
     0.00 Mb [kworker/1:0H] 
     0.00 Mb [cpuhp/2] 
     0.00 Mb [watchdog/2] 
     0.00 Mb [migration/2] 
     0.00 Mb [ksoftirqd/2] 
     0.00 Mb [kworker/2:0H] 
     0.00 Mb [cpuhp/3] 
     0.00 Mb [watchdog/3] 
     0.00 Mb [migration/3] 
     0.00 Mb [ksoftirqd/3] 
     0.00 Mb [kworker/3:0H] 
     0.00 Mb [kdevtmpfs] 
     0.00 Mb [netns] 
     0.00 Mb [khungtaskd] 
     0.00 Mb [oom_reaper] 
     0.00 Mb [writeback] 
     0.00 Mb [kcompactd0] 
     0.00 Mb [ksmd] 
     0.00 Mb [khugepaged] 
     0.00 Mb [crypto] 
     0.00 Mb [kintegrityd] 
     0.00 Mb [bioset] 
     0.00 Mb [kblockd] 
     0.00 Mb [devfreq_wq] 
     0.00 Mb [watchdogd] 
     0.00 Mb [kswapd0] 
     0.00 Mb [vmstat] 
     0.00 Mb [kthrotld] 
     0.00 Mb [ipv6_addrconf] 
     0.00 Mb [acpi_thermal_pm] 
     0.00 Mb [ata_sff] 
     0.00 Mb [scsi_eh_0] 
     0.00 Mb [scsi_tmf_0] 
     0.00 Mb [scsi_eh_1] 
     0.00 Mb [scsi_tmf_1] 
     0.00 Mb [scsi_eh_2] 
     0.00 Mb [scsi_tmf_2] 
     0.00 Mb [scsi_eh_3] 
     0.00 Mb [scsi_tmf_3] 
     0.00 Mb [scsi_eh_4] 
     0.00 Mb [scsi_tmf_4] 
     0.00 Mb [scsi_eh_5] 
     0.00 Mb [scsi_tmf_5] 
     0.00 Mb [bioset] 
     0.00 Mb [kworker/1:1H] 
     0.00 Mb [kworker/3:1H] 
     0.00 Mb [kworker/0:1H] 
     0.00 Mb [kdmflush] 
     0.00 Mb [bioset] 
     0.00 Mb [kdmflush] 
     0.00 Mb [bioset] 
     0.00 Mb [jbd2/sda5
     0.00 Mb [ext4
     0.00 Mb [kworker/2:1H] 
     0.00 Mb [kauditd] 
     0.00 Mb [bioset] 
     0.00 Mb [drbd
     0.00 Mb [irq/27
     0.00 Mb [i915/signal:0] 
     0.00 Mb [i915/signal:1] 
     0.00 Mb [i915/signal:2] 
     0.00 Mb [ttm_swap] 
     0.00 Mb [cfg80211] 
     0.00 Mb [kworker/u17:0] 
     0.00 Mb [hci0] 
     0.00 Mb [hci0] 
     0.00 Mb [kworker/u17:1] 
     0.00 Mb [iprt
     0.00 Mb [iprt
     0.00 Mb [kworker/1:0] 
     0.00 Mb [kworker/3:0] 
     0.00 Mb [kworker/0:0] 
     0.00 Mb [kworker/2:0] 
     0.00 Mb [kworker/u16:0] 
     0.00 Mb [kworker/u16:2] 
     0.00 Mb [kworker/3:2] 
     0.00 Mb [kworker/2:1] 
     0.00 Mb [kworker/1:2] 
     0.00 Mb [kworker/0:2] 
     0.00 Mb [kworker/2:2] 
     0.00 Mb [kworker/0:1] 
     0.00 Mb [scsi_eh_6] 
     0.00 Mb [scsi_tmf_6] 
     0.00 Mb [usb
     0.00 Mb [bioset] 
     0.00 Mb [kworker/3:1] 
     0.00 Mb [kworker/u16:1] 

¿Qué pasa con time ?

No es el Bash construido time sino el que puede encontrar con which time , por ejemplo / usr / bin / time

Esto es lo que cubre, en un simple ls :

$ /usr/bin/time --verbose ls
(...)
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 2372
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 121
Voluntary context switches: 2
Involuntary context switches: 9
Swaps: 0
File system inputs: 256
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

Este es un excelente resumen de las herramientas y problemas: enlace archive.org

Lo citaré, para que más desarrolladores lo lean.

  

Si desea analizar el uso de memoria de todo el sistema o analizar a fondo el uso de memoria de una aplicación (no solo su uso de almacenamiento dinámico), use exmap . Para el análisis de todo el sistema, encuentre procesos con el mayor uso efectivo, toman la mayor cantidad de memoria en la práctica, encuentran procesos con el mayor uso de escritura, crean la mayor cantidad de datos (y, por lo tanto, posiblemente pierden o son muy ineficaces en su uso de datos). Seleccione dicha aplicación y analice sus asignaciones en la segunda vista de lista. Vea la sección exmap para más detalles. También use xrestop para verificar el alto uso de los recursos X, especialmente si el proceso del servidor X requiere mucha memoria. Vea la sección xrestop para más detalles.

     

Si desea detectar fugas, use valgrind o posiblemente kmtrace .

     

Si desea analizar el uso del montón (malloc, etc.) de una aplicación, ejecútelo en memprof o con kmtrace , perfile la aplicación y busque la llamada de función árbol para mayores asignaciones. Vea sus secciones para más detalles.

Además de las soluciones enumeradas en tus respuestas, puedes usar el comando de Linux '' top ''; Proporciona una vista dinámica en tiempo real del sistema en ejecución, proporciona el uso de la CPU y la memoria, para todo el sistema junto con todos los programas, en porcentaje:

top

para filtrar por un programa pid:

top -p <PID>

para filtrar por un nombre de programa:

top | grep <PROCESS NAME>

" arriba " también proporciona algunos campos como:

VIRT - Imagen virtual (kb): la cantidad total de memoria virtual utilizada por la tarea

RES - Tamaño residente (kb): la memoria física no intercambiada que una tarea ha utilizado; RES = CÓDIGO + DATOS.

DATOS - Datos + Tamaño de pila (kb): la cantidad de memoria física dedicada a otro código que no sea ejecutable, también conocido como el tamaño del "conjunto residente de datos" o DRS.

SHR - Tamaño de memoria compartida (kb): la cantidad de memoria compartida utilizada por una tarea. Simplemente refleja la memoria que podría compartirse potencialmente con otros procesos.

Referencia aquí .

No hay una respuesta única para esto porque no puede determinar con precisión la cantidad de memoria que utiliza un proceso. La mayoría de los procesos en Linux utilizan bibliotecas compartidas. Por ejemplo, supongamos que desea calcular el uso de memoria para el proceso 'ls'. ¿Cuenta solo la memoria utilizada por el ejecutable 'ls' (si pudiera aislarlo)? ¿Qué tal libc? ¿O todas estas otras bibliotecas que se requieren para ejecutar 'ls'?

linux-gate.so.1 =>  (0x00ccb000)
librt.so.1 => /lib/librt.so.1 (0x06bc7000)
libacl.so.1 => /lib/libacl.so.1 (0x00230000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)
libc.so.6 => /lib/libc.so.6 (0x00b40000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)
/lib/ld-linux.so.2 (0x00b1d000)
libattr.so.1 => /lib/libattr.so.1 (0x00229000)
libdl.so.2 => /lib/libdl.so.2 (0x00cae000)
libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)

Se podría argumentar que son compartidos por otros procesos, pero 'ls' no se puede ejecutar en el sistema sin que se carguen.

Además, si necesita saber cuánta memoria necesita un proceso para planificar la capacidad, debe calcular cuánto usa cada copia adicional del proceso. Creo que / proc / PID / status podría brindarle suficiente información sobre el uso de la memoria EN una sola vez. Por otro lado, valgrind le dará un mejor perfil del uso de la memoria durante toda la vida útil del programa

Si su código está en C o C ++, es posible que pueda usar getrusage () que le devuelve varias estadísticas sobre el uso de memoria y tiempo de su proceso.

Sin embargo, no todas las plataformas admiten esto y devolverán valores 0 para las opciones de uso de memoria.

En su lugar, puede mirar el archivo virtual creado en / proc / [pid] / statm (donde [pid] se reemplaza por su ID de proceso. Puede obtener esto desde getpid () ).

Este archivo se verá como un archivo de texto con 7 enteros. Probablemente esté más interesado en los números primero (uso de memoria) y sexto (uso de memoria de datos) en este archivo.

Valgrind puede mostrar información detallada pero ralentiza la aplicación de destino de manera significativa, y la mayoría de las veces cambia el comportamiento de la aplicación.
Exmap era algo que aún no sabía, pero parece que necesita un módulo de kernel para obtener la información, lo que puede ser un obstáculo.

Asumo lo que todos quieren saber WRT " uso de memoria " es el siguiente ...
En Linux, la cantidad de memoria física que puede usar un solo proceso puede dividirse aproximadamente en las siguientes categorías.

  • M. una memoria mapeada anónima

    • .p privado
      • .d dirty == malloc / mmapped montón y pila asignada y memoria escrita
      • .c clean == malloc / mmapped memoria de pila y pila una vez asignada, escrita, luego liberada, pero aún no recuperada
    • .s compartido
      • .d dirty == el montón malloc / mmaped podría copiarse y escribirse y compartirse entre procesos (editado)
      • .c clean == el montón malloc / mmaped podría copiarse y escribirse y compartirse entre procesos (editado)
  • M.n nombrada memoria asignada

    • .p privado
      • .d dirty == archivo mmapped memoria escrita privada
      • .c clean == programa mapeado / texto de biblioteca privado mapeado
    • .s compartido
      • .d dirty == archivo mmapped memoria escrita compartida
      • .c clean == texto de biblioteca mapeado compartido mapeado

La utilidad incluida en Android llamada showmap es bastante útil

virtual                    shared   shared   private  private
size     RSS      PSS      clean    dirty    clean    dirty    object
-------- -------- -------- -------- -------- -------- -------- ------------------------------
       4        0        0        0        0        0        0 0:00 0                  [vsyscall]
       4        4        0        4        0        0        0                         [vdso]
      88       28       28        0        0        4       24                         [stack]
      12       12       12        0        0        0       12 7909                    /lib/ld-2.11.1.so
      12        4        4        0        0        0        4 89529                   /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
      28        0        0        0        0        0        0 86661                   /usr/lib/gconv/gconv-modules.cache
       4        0        0        0        0        0        0 87660                   /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
       4        0        0        0        0        0        0 89528                   /usr/lib/locale/en_US.utf8/LC_TELEPHONE
       4        0        0        0        0        0        0 89527                   /usr/lib/locale/en_US.utf8/LC_ADDRESS
       4        0        0        0        0        0        0 87717                   /usr/lib/locale/en_US.utf8/LC_NAME
       4        0        0        0        0        0        0 87873                   /usr/lib/locale/en_US.utf8/LC_PAPER
       4        0        0        0        0        0        0 13879                   /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
       4        0        0        0        0        0        0 89526                   /usr/lib/locale/en_US.utf8/LC_MONETARY
       4        0        0        0        0        0        0 89525                   /usr/lib/locale/en_US.utf8/LC_TIME
       4        0        0        0        0        0        0 11378                   /usr/lib/locale/en_US.utf8/LC_NUMERIC
    1156        8        8        0        0        4        4 11372                   /usr/lib/locale/en_US.utf8/LC_COLLATE
     252        0        0        0        0        0        0 11321                   /usr/lib/locale/en_US.utf8/LC_CTYPE
     128       52        1       52        0        0        0 7909                    /lib/ld-2.11.1.so
    2316       32       11       24        0        0        8 7986                    /lib/libncurses.so.5.7
    2064        8        4        4        0        0        4 7947                    /lib/libdl-2.11.1.so
    3596      472       46      440        0        4       28 7933                    /lib/libc-2.11.1.so
    2084        4        0        4        0        0        0 7995                    /lib/libnss_compat-2.11.1.so
    2152        4        0        4        0        0        0 7993                    /lib/libnsl-2.11.1.so
    2092        0        0        0        0        0        0 8009                    /lib/libnss_nis-2.11.1.so
    2100        0        0        0        0        0        0 7999                    /lib/libnss_files-2.11.1.so
    3752     2736     2736        0        0      864     1872                         [heap]
      24       24       24        0        0        0       24 [anon]
     916      616      131      584        0        0       32                         /bin/bash
-------- -------- -------- -------- -------- -------- -------- ------------------------------
   22816     4004     3005     1116        0      876     2012 TOTAL

Estoy usando htop ; es un muy buen programa de consola similar al Administrador de tareas de Windows.

Valgrind es increíble si tienes tiempo para ejecutarlo. valgrind --tool = massif es la solución correcta.

Sin embargo, estoy empezando a ejecutar ejemplos más grandes, y usar valgrind ya no es práctico. ¿Hay alguna manera de saber el uso máximo de memoria (tamaño de página de módulo y páginas compartidas) de un programa?

En un sistema Unix real, / usr / bin / time -v funciona. En Linux, sin embargo, esto no funciona.

Tres métodos más para probar:

  1. ps aux --sort pmem
    Ordena la salida por % MEM .
  2. ps aux | awk '{print $ 2, $ 4, $ 11}' | ordenar -k2r | head -n 15
    Se ordena usando tuberías.
  3. top -a
    Comienza la clasificación superior por %MEM

(Extraído de aquí )

#!/bin/ksh
#
# Returns total memory used by process $1 in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#

IFS=\n'

for line in $(</proc/$1/smaps)
do
   [[ $line =~ ^Size:\s+(\S+) ]] && ((kb += ${.sh.match[1]}))
done

print $kb

Una buena prueba del más "mundo real" el uso es abrir la aplicación, luego ejecutar vmstat -s y verificar la " memoria activa " estadística. Cierre la aplicación, espere unos segundos y ejecute vmstat -s nuevamente. Sin embargo, la aplicación ha utilizado evidentemente mucha memoria activa.

Si el proceso no está utilizando demasiada memoria (ya sea porque espera que este sea el caso, o algún otro comando haya dado esta indicación inicial), y el proceso puede soportar ser detenido por un corto período de tiempo, usted puede intentar usar el comando gcore.

gcore <pid>

Verifique el tamaño del archivo central generado para tener una buena idea de cuánta memoria está usando un proceso en particular.

Esto no funcionará demasiado bien si el proceso está utilizando cientos de megas o conciertos, ya que la generación del núcleo podría tardar varios segundos o minutos en crearse dependiendo del rendimiento de E / S. Durante la creación del núcleo, el proceso se detiene (o se congela) para evitar cambios en la memoria. Así que ten cuidado.

También asegúrese de que el punto de montaje donde se genera el núcleo tenga mucho espacio en disco y que el sistema no reaccione negativamente al archivo central que se está creando en ese directorio en particular.

A continuación, la línea de comando le dará la memoria total utilizada por los diversos procesos que se ejecutan en la máquina Linux en MB

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | awk '{total=total + $1} END {print total}'

Estoy usando Arch Linux y hay este maravilloso paquete llamado ps_mem

ps_mem -p <pid>

Ejemplo de salida

$ ps_mem -S -p $(pgrep firefox)

Private   +   Shared  =  RAM used   Swap used   Program

355.0 MiB +  38.7 MiB = 393.7 MiB    35.9 MiB   firefox
---------------------------------------------
                        393.7 MiB    35.9 MiB
=============================================

Obtener valgrind. dele su programa para que se ejecute y le informará mucho sobre el uso de la memoria.

Esto se aplicaría solo para el caso de un programa que se ejecuta por un tiempo y se detiene. No sé si valgrind puede tener en sus manos un proceso que ya se está ejecutando o si no debería detener procesos como los demonios.

Editar: esto funciona 100% bien solo cuando el consumo de memoria aumenta

Si desea monitorear el uso de la memoria mediante un proceso determinado (o grupo de nombres comunes compartidos procesados, por ejemplo, google-chrome , puede usar mi script bash:

while true; do ps aux | awk ‚{print $5, $11}’ | grep chrome | sort -n > /tmp/a.txt; sleep 1; diff /tmp/{b,a}.txt; mv /tmp/{a,b}.txt; done;

esto buscará cambios continuamente y los imprimirá.

ingrese la descripción de la imagen aquí

Si quiere algo más rápido que crear perfiles con Valgrind y su núcleo es más antiguo y no puede usar smaps, una ps con las opciones para mostrar el conjunto residente del proceso (con ps -o rss, comando ) puede proporcionarle un _aproximation_ rápido y razonable de la cantidad real de memoria no intercambiada que se utiliza.

Sugeriría que lo uses encima. Puede encontrar todo al respecto en esta página . Es capaz de proporcionar todos los KPI necesarios para sus procesos y también puede capturar en un archivo.

Verifique el script de shell para verificar uso de memoria por aplicación en linux . También disponible en github y en una versión sin pegar y bc .

Otra votación para aquí, pero yo quisiera agregar que puede usar una herramienta como Alleyoop para ayudarlo a interpretar los resultados generados por valgrind.

Uso las dos herramientas todo el tiempo y siempre tengo un código delgado y sin fugas para mostrarlo con orgullo;)

Si bien esta pregunta parece ser sobre el examen de los procesos que se ejecutan actualmente, quería ver la memoria máxima utilizada por una aplicación de principio a fin. Además de valgrind, puede usar tstime , que es mucho más simple. Mide el "highwater" uso de memoria (RSS y virtual). De esta respuesta .

Utilice la herramienta GUI integrada ' monitor de sistema ' disponible en ubuntu

Basado en la respuesta a un pregunta .

Puede usar SNMP para obtener el uso de memoria y CPU de un proceso en un dispositivo en particular en la red :)

Requisitos :

  • el dispositivo que ejecuta el proceso debería tener snmp instalado y ejecutándose
  • snmp debe configurarse para aceptar solicitudes desde donde ejecutará el script a continuación (puede configurarse en snmpd.conf)
  • debe conocer la identificación del proceso (pid) del proceso que desea monitorear

Notas :

  • HOST-RESOURCES-MIB::hrSWRunPerfCPU es la cantidad de centi-segundos de los recursos totales de CPU del sistema consumidos por este proceso. Tenga en cuenta que en un sistema multiprocesador, este valor puede aumentar en más de un centi-segundo en un centi-segundo de tiempo real (reloj de pared).

  • HOST-RESOURCES-MIB::hrSWRunPerfMem es la cantidad total de memoria real del sistema asignada a este proceso.

**

Script de supervisión del proceso:

**

echo "IP: "
read ip
echo "specfiy pid: "
read pid
echo "interval in seconds:"
read interval

while [ 1 ]
do
    date
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pid
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pid
    sleep $interval;
done
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top