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.