2010-01-29 04:03:01 +0000 2010-01-29 04:03:01 +0000
26
26

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

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

Respuestas (8)

11
11
11
2015-03-11 13:16:28 +0000

La respuesta de @user26528 no calcula bien la memoria - se necesita la suma de los mapeos en smaps, no sólo el 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
11
11
11
2010-01-29 07:09:40 +0000

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 la memoria física total y la cantidad de espacio de intercambio que se necesitaría para intercambiar el proceso. Esto y mucho más está documentado en la página man de ps.

8
8
8
2012-02-04 10:26:12 +0000

Lista de procesos por uso de memoria

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

7
7
7
2010-01-29 11:20:18 +0000

Obtener el uso de la memoria a través de ps es bastante poco fiable. Si tienes un kernel más nuevo debería soportar /proc/pid#/smaps que te da información detallada sobre el uso de la memoria de cada proceso. Abajo hay un script bastante sucio y rápido para recorrer cada proceso abierto y obtener 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
4
4
4
2010-01-29 04:20:47 +0000

puede utilizar

top -n 1
3
3
3
2016-09-23 15:51:44 +0000

Actualización:

El siguiente one-liner 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 listar todos los procesos del usuario ordenados por el mayor uso de memoria en MB de esta manera:

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

Puede utilizar command= en lugar de comm= para mostrar el proceso de la ruta completa.

El = sólo elimina el título de la columna.

3
3
3
2017-04-04 12:27:34 +0000

Encontré que muchas veces el mismo proceso tiene subprocesos de bifurcación y usted está interesado en la memoria total utilizada por el proceso. por ejemplo, google chrome inicia múltiples procesos y desea saber la memoria total tomada por chrome. Encontré el siguiente comando de una 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 la memoria en MB, ordenar la memoria y principalmente agrupar por comando. También agrupa %CPU y %memoria. Muestra los datos en un formato fácil de usar.

Este comando fue inspirado en la respuesta de este y me ayudó mucho a tener una idea de qué proceso está ocupando mis recursos.

3
3
3
2014-12-05 07:40:22 +0000

Listado de procesos por uso de mem

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