¿Cómo puedo mostrar el uso de memoria de cada proceso si hago un 'ps -ef'?

24

En Linux, ¿cómo puedo mostrar el uso de memoria de cada proceso si hago un ps -ef? Me gustaría ver la 'memoria virtual', 'memoria res', 'memoria compartida' de cada progreso. Puedo obtenerlo a través de top, pero quiero la misma información ps -efpara poder canalizar la salida grepcon mi nombre de proceso.

hap497
fuente

Respuestas:

8

Obtener el uso de memoria a través de ps es bastante poco confiable. Si tiene un kernel más nuevo, debería ser compatible con / proc / pid # / smaps que le brinda información detallada sobre el uso de memoria de cada proceso. A continuación se muestra una secuencia de comandos bastante sucia y rápida para recorrer cada proceso que está abierto y tomar el tamaño, Rss, Pss y uso compartido limpio / sucio. Esperemos que pueda ser útil de alguna manera.

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done
usuario26528
fuente
1
Debería sumar la columna Tamaño. Ver la respuesta de ezsmith a continuación.
Basil A
11

ps ef -o command,vsize,rss,%mem,size

No pude encontrar una opción para la memoria compartida, pero sí encontré opciones para el% de memoria física total y la cantidad de espacio de intercambio que sería necesario para intercambiar el proceso. Esto y mucho más está documentado en la página del manual para ps.

Justin Smith
fuente
Las cuentas de Linux comparten memoria en la memoria para cada proceso, lo que puede conducir a sumas falsas si tiene muchos procesos conectados a un segmento de memoria compartida grande. top, psy programas similares se ven afectados por esto de la misma manera.
Peter Eisentraut
Sé cómo funciona la memoria compartida, pero parece que ps no puede proporcionar esa información (o al menos no pude encontrarla en mi documentación de ps). top u htop en realidad puede mostrar el uso de memoria compartida por proceso.
Justin Smith el
9

La respuesta de @ user26528 no calcula la memoria correctamente: necesita la suma de las asignaciones en smaps, no solo la superior. Este script debería hacerlo:

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done
evsmith
fuente
Salidas: línea 16: +: error de sintaxis: operando esperado (el token de error es "+"), que es la línea que contiene: echo "Private $ (($ pd + $ pc)) kB", estoy ejecutando en CentOS 7 .
albahaca Una
2
@evsmith ¿por qué agregar 0.5 a Pss?
Pete
1
Ejecutar 10.000 scripts Awk pequeños es un antipatrón masivo, solo debe refactorizar todo esto en un solo script Awk.
tripleee
pero este script en sí consume demasiada memoria
mehmet riza oz
8

Lista de procesos por uso de memoria

ps -e -orss =, args = | ordenar -b -k1,1n

vasily-vm
fuente
Se usa ps -e -orss=,pid=,args= | sort -b -k1,1npara incluir la identificación del proceso
Jacob
pspuede ordenar por su cuenta:ps -eo rss=,args= --sort +rss
phil294
4

puedes usar

top -n 1
A.m.
fuente
3

Lista de procesos por uso de memoria

comando: ps -e -orss =, args = | ordenar -b -k1,1n | pr -TW $ COLUMNS \

Jijo John
fuente
3

Actualizar:

La siguiente línea también proporciona información sobre el consumo total de memoria del usuario actual.

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

Acabo de enumerar todos los procesos de usuario ordenados por el uso de memoria más alto en MB como este:

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

Puedes usar en command=lugar decomm= mostrar el proceso de ruta completa.

El =solo elimina el título de la columna.

raratiru
fuente
3

Descubrí que muchas veces el mismo proceso tiene un subproceso de fork y usted está interesado en la memoria total utilizada por el proceso. Por ejemplo, Google Chrome inicia un proceso múltiple y desea saber la memoria total tomada por Chrome. Encontré debajo de un comando de línea muy útil

echo "%CPU   %MEM    MEM     PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

Se encarga de muchas cosas, como mostrar memoria en MB, ordenar en memoria y principalmente agrupar por comando. También está agrupando% CPU y% memoria. Muestra datos en un formato fácil de usar.

Este comando se inspiró en esta respuesta y me ayudó mucho a tener una idea de qué proceso está consumiendo mis recursos.

ashah
fuente