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


24

In Linux, come posso visualizzare l'utilizzo della memoria di ogni processo se faccio un ps -ef? Vorrei vedere la "memoria virtuale", la "memoria res", la "memoria condivisa" di ogni progresso. Posso ottenerlo tramite top, ma voglio le stesse informazioni in ps -efmodo da poter reindirizzare l'output grepcon il mio nome del processo.

Risposte:


8

Ottenere l'utilizzo della memoria tramite ps non è abbastanza affidabile. Se hai un kernel più recente, dovrebbe supportare / proc / pid # / smaps che ti fornisce alcune informazioni dettagliate sull'utilizzo della memoria di ciascun processo. Di seguito è riportato uno script piuttosto sporco e veloce per scorrere ogni processo aperto e afferrare l'utilizzo di Size, Rss, Pss e Shared Clean / Dirty. Spero che 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

1
Dovresti sommare la colonna Dimensione. Vedi la risposta di ezsmith di seguito.
Basilio

11

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

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


Gli account Linux hanno condiviso la memoria nella memoria per ogni processo, il che può portare a somme fasulle se si hanno molti processi collegati a un ampio segmento di memoria condivisa. top, pse programmi simili ne sono tutti influenzati allo stesso modo.
Peter Eisentraut,

So come funziona la memoria condivisa, ma sembra che ps non sia in grado di fornire tali informazioni (o almeno non sono riuscito a trovarle nella mia documentazione ps). top o htop possono effettivamente mostrare l'utilizzo della memoria condivisa in base al processo.
Justin Smith,

9

La risposta di @utente26528 non calcola correttamente la memoria, ma è necessaria la somma delle mappature in smap, non solo quella in alto. 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

Output: riga 16: +: errore di sintassi: operando previsto (il token di errore è "+") che è la riga che contiene: echo "Private $ (($ pd + $ pc)) kB", sto eseguendo CentOS 7 .
basilico a

2
@evsmith perché aggiungere 0,5 a Pss?
Pete,

1
L'esecuzione di 10.000 piccoli script Awk è un enorme antipattern, dovresti semplicemente trasformare tutto questo in un singolo script Awk.
tripleee

ma questo stesso script consuma troppa memoria
mehmet riza oz

8

Elenca i processi in base all'utilizzo della memoria

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


Utilizzare ps -e -orss=,pid=,args= | sort -b -k1,1nper includere l'id del processo
Jacob,

pspuò ordinare da solo:ps -eo rss=,args= --sort +rss
phil294


3

Elenca i processi in base all'utilizzo dei mem

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


3

Aggiornare:

Il seguente one-liner fornisce anche informazioni sul consumo totale di memoria da parte 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 in base al 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

È possibile utilizzare command=invece di comm=mostrare l'intero processo del percorso.

Il =solo rimuove il titolo della colonna.


3

Ho scoperto che molte volte lo stesso processo ha un processo secondario fork e sei interessato alla memoria totale utilizzata dal processo. ad es. google chrome avvia più processi e desideri conoscere la memoria totale utilizzata da Chrome. Ho trovato molto utile il comando sotto una riga

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 in memoria e principalmente raggruppare per comando. Sta inoltre raggruppando% CPU e% memoria. Mostra i dati in un formato intuitivo.

Questo comando è stato ispirato da questa risposta e mi ha aiutato molto a farmi un'idea su quale processo sta prendendo le mie risorse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.