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

Come posso visualizzare l'uso della memoria di ogni processo se faccio un 'ps -ef'?

In Linux, come posso visualizzare l'utilizzo della memoria di ogni processo se faccio un ps -ef? Vorrei vedere la ‘memoria virtuale’, ‘memoria res’, ‘memoria condivisa’ di ogni processo. Posso ottenerlo tramite top, ma voglio le stesse informazioni in ps -ef in modo da poter convogliare l'output a grep con il mio nome di processo.

Risposte (8)

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

La risposta di @user26528 non calcola correttamente la memoria - hai bisogno della somma delle mappature in smap, non solo quella superiore. Questo script dovrebbe farlo:

#!/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

Non sono riuscito a trovare un'opzione per la memoria condivisa, ma ho trovato opzioni per la % della memoria fisica totale e la quantità di swapspace che sarebbe necessaria per scambiare il processo. Questo e molto altro è documentato nella pagina man di ps.

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

Elenca i processi per uso di memoria

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

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

Ottenere l'uso della memoria attraverso ps è piuttosto inaffidabile. Se avete un kernel più recente dovrebbe supportare /proc/pid#/smaps che vi dà alcune informazioni dettagliate sull'uso della memoria di ogni processo. Qui sotto c'è uno script abbastanza sporco e veloce per fare un loop su ogni processo aperto e prendere la dimensione, Rss, Pss e l'uso di Shared Clean/Dirty. Speriamo possa essere utile in qualche modo.

#!/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

potete usare

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

Aggiornamento:

Il seguente one-liner fornisce anche informazioni sul consumo totale di memoria dell'utente corrente.

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'"

Ho appena elencato tutti i processi utente ordinati per il più alto utilizzo di memoria in MB in questo modo:

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

Puoi usare command= invece di comm= per mostrare il processo completo del percorso.

Lo = rimuove solo il titolo della colonna.

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

Ho scoperto che molte volte lo stesso processo ha dei sottoprocessi a forcella e si è interessati alla memoria totale utilizzata dal processo. Ad esempio, Google Chrome avvia più processi e si desidera conoscere la memoria totale utilizzata da Chrome. Ho trovato il seguente comando di una linea molto utile

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

Si occupa di molte cose, come mostrare la memoria in MB, ordinare la memoria e soprattutto raggruppare per comando. Raggruppa anche %CPU e %memoria. Mostra i dati in un formato facile da usare.

Questo comando è stato ispirato da questa risposta e mi ha aiutato molto a capire quale processo sta occupando le mie risorse.

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

Elenca i processi per uso di memoria

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