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 de blog de Comprender el uso de memoria en Linux , ps
no es una herramienta precisa para usar con este propósito.
¿Por qué
ps
está "mal"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 .
ps
, ni siquiera muestra eso: muestra números de memoria virtual y residente, donde virtual es la cantidad máxima de memoria que el proceso podría usar teóricamente, era el único proceso (nunca), usaba cada página que asignaba (nunca sucede) y no asignó ni desasignó ninguna página (poco probable). Mientras que el residente muestra la cantidad de memoria virtual asignada a la física en este momento.virt > usage > res
Sin embargo, típicamente en un sistema de 64 bitsvirt ~= res*10
es un rango muy amplio.Respuestas:
Con
ps
herramientas similares o 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':Como se explica en la documentación de valgrind , debe ejecutar el programa a través de valgrind:
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 el visualizador macizo . Pero encontréms_print
una herramienta simple basada en texto enviada con valgrind ya es de gran ayuda.Para encontrar pérdidas de memoria, use la
memcheck
herramienta (predeterminada) de valgrind.fuente
Pruebe el comando pmap :
fuente
gnome-system-monitor
Es difícil decirlo con certeza, pero aquí hay dos cosas "cercanas" que pueden ayudar.
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
da.fuente
gnome-system-monitor
En versiones recientes de Linux, use el subsistema smaps . Por ejemplo, para un proceso con un PID de 1234:
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.
fuente
pmap
es una interfaz más simple.No hay una manera fácil de calcular esto. Pero algunas personas han tratado de obtener algunas buenas respuestas:
fuente
ps_mem
ysmem
muy útil para las medidas del usuario final, por ejemplo.pmap
La salida muy detallada está orientada a los desarrolladores ... permite recuperar el uso de la memoria de Firefox para cada fuente, complementos, bibliotecas, por ejemplo. Gracias a todos. @Bash, @thomasruther.gnome-system-monitor
Use 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 memoria única ). No incluye memoria compartida. Así, esta voluntad bajo -report la cantidad de memoria que un proceso de usos, pero es muy útil cuando se quiere hacer caso omiso de 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 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 para la memoria física .
Cómo se compara esto con RSS según lo informado por ps y otras utilidades:
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 comando como si fuera ps -A v, entonces no necesita instalar la dependencia recomendada de python-matplotlib.
fuente
Use esto como root y puede obtener una salida clara para el uso de memoria por cada proceso.
EJEMPLO DE SALIDA:
fuente
x=2
también a la salida pid y user.¿Qué hay de
time
?No el Bash incorporado
time
sino el que puedes encontrarwhich time
, por ejemplo/usr/bin/time
Esto es lo que cubre, en un simple
ls
:fuente
brew install gnu-time
luego úsalogtime
si estás en macOS.Este es un excelente resumen de las herramientas y problemas: enlace archive.org
Lo citaré, para que más desarrolladores lo lean.
fuente
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 cada programa, en porcentaje:
filtrar por un programa pid:
para filtrar por un nombre de programa:
"top" 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 - Tamaño de datos + pila (kb): la cantidad de memoria física dedicada a otro código que no sea ejecutable, también conocido como el tamaño de '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.
La referencia aquí .
fuente
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 librerías que se requieren para ejecutar 'ls'?
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 utiliza 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.
fuente
pmap
Si su código está en C o C ++, puede usarlo,
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 obtenerlo degetpid()
).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.
fuente
getpid()
, porque no conozco unagetprocessid()
función en C / C ++ en Linux.Valgrind puede mostrar información detallada, pero ralentiza significativamente la aplicación de destino, 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 del núcleo para obtener la información, lo que puede ser un obstáculo.
Supongo que lo que todo el mundo quiere saber es el "uso de memoria" de WRT: ...
En Linux, la cantidad de memoria física que puede usar un solo proceso puede dividirse aproximadamente en las siguientes categorías.
Ma memoria anónima mapeada
Mn llamado memoria asignada
La utilidad incluida en Android llamada showmap es bastante útil
fuente
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 ordena usando tuberías.
top -a
Comienza la clasificación superior por
%MEM
(Extraído de aquí )
fuente
top
y probablemente los otros no dan una representación precisa de la memoria realmente utilizada por el proceso. Por ejemplo, tengo 64GiB de RAM, y tengo 10postgres
procesos que informan 16GiB RES y 25% MEM. Por supuesto, no todos pueden usar el 25% ... Cada uno también tiene 15GiB SHR, y parece que están compartiendo eso.fuente
sed | awk
y funciona en Busybox v1.23.2:sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
Estoy usando
htop
; Es un muy buen programa de consola similar al Administrador de tareas de Windows.fuente
htop
y es mejor que top, pero aún así te mostrará todos los hilos de diferentes aplicaciones sin agruparlos, lo que lo hace casi tan inútil como top.Si el proceso no está usando demasiada memoria (ya sea porque espera que sea así, 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, puede intentar usa el comando gcore.
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 "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 suficiente espacio en disco y que el sistema no reaccione negativamente al archivo central que se está creando en ese directorio en particular.
fuente
Estoy usando Arch Linux y hay este maravilloso paquete llamado
ps_mem
Salida de ejemplo
fuente
La siguiente línea de comando le dará la memoria total utilizada por los distintos procesos que se ejecutan en la máquina Linux en MB
fuente
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 yvmstat -s
vuelva a ejecutar . Sin embargo, la memoria liberaba mucha memoria activa que evidentemente estaba en uso por la aplicación.fuente
Consigue 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 no debería detener procesos como los demonios.
fuente
Editar: esto funciona 100% bien solo cuando aumenta el consumo de memoria
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:esto buscará cambios continuamente y los imprimirá.
fuente
Si desea algo más rápido que el perfil con Valgrind y su kernel 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 cantidad rápida y razonable_aproximation_
de la cantidad real de memoria no intercambiada en uso.fuente
Te sugiero 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.
fuente
atop -R
. Para mostrar una inserción resumida por usuariop
, para ordenar por uso de memoria, presione 'M' desde dentro. Esto proporciona números similares a smem.Verifique el script de shell para verificar el uso de memoria por aplicación en Linux . También disponible en github y en una versión sin pegar y bc .
fuente
Otro voto por 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;)
fuente
Si bien esta pregunta parece ser sobre el examen de los procesos que se están ejecutando actualmente, quería ver el pico de memoria utilizado 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 la memoria "highwater" (RSS y virtual). De esta respuesta .
fuente
Basado en la respuesta a una pregunta relacionada .
Puede usar SNMP para obtener el uso de memoria y CPU de un proceso en un dispositivo en particular en la red :)
Requisitos:
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 monitoreo de procesos:
** **
fuente
/ prox / xxx / numa_maps da alguna información allí: N0 = ??? N1 = ??? Pero este resultado puede ser inferior al resultado real, ya que solo cuenta los que se han tocado.
fuente
Use la herramienta GUI incorporada ' monitor de sistema ' disponible en ubuntu
fuente