¿Cómo medir el uso de memoria real de una aplicación o proceso?
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 porps
son casi definitivamente incorrectos .
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)
- .p privado
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
- .p privado
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:
-
ps aux --sort pmem
Ordena la salida por% MEM
. -
ps aux | awk '{print $ 2, $ 4, $ 11}' | ordenar -k2r | head -n 15
Se ordena usando tuberías. -
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á.
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 .
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