¿Cómo medir el uso de memoria real de una aplicación o proceso?


Esta pregunta está cubierta aquí con gran detalle.

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

Del artículo del blog de Entendiendo el uso de memoria en Linux, ps no es una herramienta precisa para usar con esta intención.

Por qué ps es "incorrecto"

Dependiendo de cómo se mire, ps no está reportando el uso de memoria real de los procesos. Lo que realmente está haciendo es mostrar cómo mucha memoria real tomaría cada proceso si fuera el único proceso en ejecución. Por supuesto, una máquina Linux típica tiene varias docenas de procesos que se ejecutan en un momento dado, lo que significa que los números VSZ y RSS reportados por ps son casi definitivamente incorrectos.

Author: Community, 2008-09-25

30 answers

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 quieres saber qué cantidad de memoria de su aplicación realmente utiliza, necesita ejecutarlo dentro de un generador de perfiles. Por ejemplo, valgrind puede darle información sobre la cantidad de memoria utilizada y, lo que es más importante, sobre posibles fugas de memoria en su programa. La herramienta heap profiler de valgrind se llama 'massif':

Massif es un generador de perfiles de pilas. Realiza perfiles detallados del montón tomando instantáneas regulares del montón de un programa. Produce un gráfico que muestra el uso del montón a lo largo del tiempo, incluyendo información sobre qué partes del programa son responsable 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 lentos de lo normal.

Como se explica en la documentación de valgrind , necesita 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 de uso de memoria, (2) para cada snapshot, un registro de la ubicación de la memoria del programa. Una gran herramienta gráfica para analizar estos archivos es massif-visualizer . Pero encontré que ms_print, una herramienta simple basada en texto enviada con valgrind, ya es de gran ayuda.

Para encontrar fugas de memoria, utilice la herramienta (predeterminada) memcheck de valgrind.

 308
Author: ypnos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-24 17:58:29

Pruebe el comando pmap:

sudo pmap -x <process pid>
 226
Author: Anil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 11:21:58

Difícil de decir con seguridad, pero aquí hay dos cosas "cercanas" 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

El más importante es el VmSize, que debe estar cerca de lo que ps aux da.

/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

 176
Author: DustinB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 05:35:57

En versiones recientes de linux, utilice 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á utilizando su instancia del programa, sin incluir la memoria compartida entre varias instancias del programa.

 123
Author: Paul Biggar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-06 09:43:38

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

 120
Author: Bash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-06 13:11:05

Uso smem, que es una alternativa a ps que calcula la USS y 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 memoria única). No incluye memoria compartida. Por lo tanto, esto en - reportará la cantidad de memoria que usa un proceso, pero es útil cuando desea ignorar lo compartido memoria.

  • PSS - Tamaño Proporcional del Conjunto. Esto es lo que quieres. Suma 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 verdaderamente representada como compartida. Piensa en la P siendo para la memoria física .

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

  • RSS - Tamaño del Conjunto Residente. Esta es la cantidad de memoria compartida más memoria no compartida utilizada por cada proceso. Si algún proceso comparte memoria, esto sobre-reportará la cantidad de memoria realmente utilizada, porque la misma memoria compartida se contará más de una vez - apareciendo de nuevo en cada otro proceso que comparte la misma memoria. Por lo tanto es bastante poco fiable, especialmente cuando alta memoria los procesos tienen muchas bifurcaciones, lo cual es común en un servidor, con cosas como Apache o procesos PHP(fastcgi/FPM).

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

 88
Author: thomasrutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-10 12:29:05

¿Qué pasa con time?

No el Bash builtin time sino el que puedes 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
 52
Author: Moonchild,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-04 21:51:08
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 por 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] 
 45
Author: Lokendra Singh Rawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-01 20:34:36

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

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 en pilas), use exmap. Para el análisis de todo el sistema, encuentre los procesos con el uso más efectivo, tomen la mayor cantidad de memoria en la práctica, encuentre los procesos con el más alto valor de escritura uso, crean la mayoría de los datos (y por lo tanto posiblemente filtran 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 recursos X, especialmente si el proceso del servidor X toma mucha memoria. Consulte la sección xrestop para más detalles.

Si desea detectar fugas, utilizar valgrind o, posiblemente, kmtrace.

Si quiere analizar el montón (malloc, etc.) uso de una aplicación, ya sea ejecutarla en memprof o con kmtrace, perfilar la aplicación y buscar en el árbol de llamadas de función las asignaciones más grandes. Vea sus secciones para más detalles.

 38
Author: phoku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-31 17:38:12

Además de las soluciones enumeradas en thy answers, puede usar el comando Linux "top"; proporciona una vista dinámica en tiempo real del sistema en ejecución, proporciona el uso de CPU y Memoria, para todo el sistema junto con para cada programa, en porcentaje:

top

Para filtrar por un programa pid:

top -p <PID>

Para filtrar por un nombre de programa:

top | grep <PROCESS NAME>

"top" proporciona también algunos campos como:

VIRT Image Imagen virtual (kb ): La cantidad total de memoria virtual utilizada por tarea

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

DATA Data Data + Stack size (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 size Tamaño del mem compartido (kb): La cantidad de memoria compartida utilizada por una tarea. Simplemente refleja la memoria que podría ser potencialmente compartida con otros procesos.

Referencia aquí.

 24
Author: Yahya Yahyaoui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-18 08:58:38

No hay una sola respuesta para esto porque no puede señalar con precisión la cantidad de memoria que utiliza un proceso. La mayoría de los procesos bajo linux usan 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 libs 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 puede ser ejecutar en el sistema sin que se carguen.

Además, si necesita saber cuánta memoria necesita un proceso para hacer la planificación de la capacidad, debe calcular cuánto usa cada copia adicional del proceso. Creo que/proc/PID / status podría darle suficiente información del uso de memoria a la vez. Por otro lado, valgrind le dará un mejor perfil del uso de memoria a lo largo de la vida útil del programa

 17
Author: Dprado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-29 02:44:26

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 soportan 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 obtenerlo de getpid()).

Este archivo se verá como un archivo de texto con 7 enteros. Usted está probablemente más interesado en el primero (uso de toda la memoria) y el sexto (uso de la memoria de datos) números en este archivo.

 14
Author: CashCow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-18 13:02:23

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 kernel para obtener la información, lo que puede ser un obstáculo.

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

  • M. una memoria mapeada anónima

    • .p privada
      • .d dirty = = malloc/mmapped heap and stack allocated and written memory
      • .c clean = = malloc/mmapped heap and stack memory once allocated, written, then freed, but not reclaimed yet
    • .s compartido
      • .d dirty = = malloc / mmaped heap could get copy-on-write and shared among processes (editado)
      • .c clean = = malloc / mmaped heap could get copy-on-write and shared among processes (edited)
  • M. n named mapped memory

    • .p privada
      • .d dirty = = archivo mmapped memoria escrita privada
      • .c clean = = mapped program/library text private mapped
    • .s compartido
      • .d dirty = = archivo mmapped memoria escrita compartida
      • .c clean = = mapeado biblioteca de texto 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
 12
Author: holmes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-31 00:53:52

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

 9
Author: Tomasz Dzięcielewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-20 09:32:13

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 del 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 .

 9
Author: Joshua Pinter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-23 21:24:37

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}' | sort -k2r | head -n 15
    Se clasifica usando tuberías.
  3. top -a
    Comienza la clasificación superior por %MEM

(Extraído de aquí)

 9
Author: Thomas Shaiker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-02 20:45:49
#!/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
 8
Author: pokute,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-09 20:58:42

Una buena prueba del uso más "real" es abrir la aplicación, luego ejecutar vmstat -s y verificar la estadística de "memoria activa". Cierre la aplicación, espere unos segundos y ejecute vmstat -s de nuevo. Sin embargo mucha memoria activa se liberó estaba en evidentemente en uso por la aplicación.

 7
Author: Nick W.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 05:33:25

Debajo de la línea de comandos 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}'
 5
Author: Vineeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 05:32:42

Consigue a valgrind. dale tu programa para que se ejecute, y te dirá mucho sobre su uso de memoria.

Esto se aplicaría solo para el caso de un programa que se ejecuta durante algún tiempo y se detiene. No se si valgrind puede tener en sus manos un proceso que ya está en ejecución o si no debería detener procesos como los demonios.

 4
Author: DarenW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-25 04:21:57

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

gcore <pid>

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

Esto no funcionará demasiado bien si el proceso está utilizando cientos de megas, o conciertos, como el núcleo la generación 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 del núcleo que se crea en ese directorio en particular.

 4
Author: Rocco Corsi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-20 09:31:25

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

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

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á continuamente los cambios y los imprimirá.

introduzca la descripción de la imagen aquí

 3
Author: test30,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-07 13:35:44

Si desea algo más rápido que perfilar con Valgrind y su núcleo es más antiguo y no puede usar smaps, un ps con las opciones para mostrar el conjunto residente del proceso (con ps -o rss,command) puede darle una _aproximation_ rápida y razonable de la cantidad real de memoria no intercambiada que se está utilizando.

 3
Author: juanjux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 05:34:37

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

 2
Author: Bobbin Zachariah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-26 07:32:34

Sugeriría que usaras atop. Puedes encontrar todo sobre él en esta página. Es capaz de proporcionar todos los KPI necesarios para sus procesos y también puede capturar a un archivo.

 2
Author: Jain Rach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-15 22:40:28

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
=============================================
 2
Author: GypsyCosmonaut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 19:57:52

Otro voto para valgrindaquí, pero me gustaría 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;)

 1
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-31 11:25:37

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

 1
Author: jtpereyda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:36:27

Utilice la herramienta GUI incorporada ' system monitor ' disponible en ubuntu

 0
Author: Sudheesh.M.S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-18 13:07:23

Basado en la respuesta a una pregunta relacionada .

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

Requisitos:

  • el dispositivo que ejecuta el proceso debe tener snmp instalado y ejecutando
  • snmp debe estar configurado para aceptar solicitudes desde donde ejecutará el script a continuación(puede estar configurado en snmpd.conf)
  • debe conocer el id de proceso (pid) del proceso desea monitorear

Notas:

  • HOST-RECURSOS-MIB:: hrSWRunPerfCPU es el número de centis-segundos del total de recursos 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 centisegundo en un centisegundo de tiempo real (reloj de pared).

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

**

Script de monitoreo de procesos:

**

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
 0
Author: Roselyn Verbo Domingo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:36