¿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 porps
son casi definitivamente incorrectos.
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.
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>
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
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.
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:
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.
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
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]
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.
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í.
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
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.
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)
- .p privada
-
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
- .p privada
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
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.
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 .
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:
-
ps aux --sort pmem
Ordena la salida por%MEM
. -
ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
Se clasifica usando tuberías. -
top -a
Comienza la clasificación superior por%MEM
(Extraído de aquí)
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
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.
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}'
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.
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.
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á.
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.
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.
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.
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
=============================================
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;)
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.
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
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
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