Jak mogę wyświetlić użycie pamięci dla każdego procesu, jeśli wykonam 'ps -ef'?

24

W systemie Linux, w jaki sposób mogę wyświetlić użycie pamięci dla każdego procesu, jeśli wykonam ps -ef? Chciałbym zobaczyć „pamięć wirtualną”, „pamięć res”, „pamięć współdzieloną” każdego postępu. Mogę to uzyskać top, ale chcę uzyskać te same informacje, ps -efaby móc przesyłać dane wyjściowe za greppomocą nazwy mojego procesu.

hap497
źródło

Odpowiedzi:

8

Uzyskanie użycia pamięci przez ps jest dość niewiarygodne. Jeśli masz nowsze jądro, powinno ono obsługiwać / proc / pid # / smaps, które dostarczają szczegółowych informacji na temat wykorzystania pamięci w każdym procesie. Poniżej znajduje się dość brudny i szybki skrypt do przechodzenia przez każdy otwarty proces i chwytania użycia Size, Rss, Pss oraz Shared Clean / Dirty. Mam nadzieję, że może być użyteczny w jakiś sposób.

#!/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
użytkownik26528
źródło
1
Powinieneś sumować kolumnę Rozmiar. Zobacz odpowiedź ezsmitha poniżej.
Basil A
11

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

Nie mogłem znaleźć opcji dla pamięci współużytkowanej, ale znalazłem opcje dla% całkowitej pamięci fizycznej i ilości obszaru wymiany, który byłby potrzebny do zamiany tego procesu. To i wiele więcej jest udokumentowane na stronie podręcznika dla ps.

Justin Smith
źródło
Konta Linux współużytkują pamięć w pamięci dla każdego procesu, co może prowadzić do fałszywych sum, jeśli masz wiele procesów podłączonych do jednego dużego segmentu pamięci wspólnej. top, psi na podobne programy ma to wpływ w ten sam sposób.
Peter Eisentraut
Wiem, jak działa pamięć współdzielona, ​​ale wygląda na to, że ps nie może dostarczyć tej informacji (lub przynajmniej nie mogłem jej znaleźć w dokumentacji ps). top lub htop faktycznie mogą pokazywać użycie pamięci współużytkowanej dla poszczególnych procesów.
Justin Smith
9

Odpowiedź @ user26528 nie całkiem poprawnie oblicza pamięć - potrzebujesz sumy odwzorowań w mapach, nie tylko górnej. Ten skrypt powinien to zrobić:

#!/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
źródło
Dane wyjściowe: linia 16: +: błąd składni: oczekiwany operand (token błędu to „+”), czyli linia zawierająca: echo „Prywatny $ (($ pd + $ pc)) kB”, działam na CentOS 7 .
Basil
2
@evsmith po co dodawać 0,5 do Pss?
Pete
1
Uruchamianie 10 000 małych skryptów Awk jest ogromnym anty-wzorem, powinieneś po prostu wszystko to przełożyć na pojedynczy skrypt Awk.
tripleee
ale sam skrypt pochłania zbyt dużo pamięci
mehmet riza oz
8

Lista procesów według zużycia pamięci

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

vasily-vm
źródło
Użyj, ps -e -orss=,pid=,args= | sort -b -k1,1naby dołączyć identyfikator procesu
Jacob
psmoże sortować samodzielnie:ps -eo rss=,args= --sort +rss
phil294
3

Wyświetl listę procesów według użycia pamięci

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

Jijo John
źródło
3

Aktualizacja:

Następujący linijka zawiera również informacje o całkowitym zużyciu pamięci przez bieżącego użytkownika.

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

Właśnie wymieniłem wszystkie procesy użytkownika posortowane według najwyższego zużycia pamięci w MB, takie jak:

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

Możesz użyć command=zamiast, comm=aby wyświetlić pełny proces ścieżki.

Po =prostu usuwa tytuł kolumny.

raratiru
źródło
3

Odkryłem, że wiele razy ten sam proces ma podproces rozwidlenia i jesteś zainteresowany całkowitą pamięcią używaną przez ten proces. np. Google Chrome uruchamia wiele procesów i chcesz poznać całkowitą pamięć zajętą ​​przez Chrome. Uważam, że polecenie poniżej jednej linii jest bardzo przydatne

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

Zajmuje się wieloma rzeczami, takimi jak wyświetlanie pamięci w MB, sortowanie pamięci i głównie grupowanie według poleceń. Grupuje również% CPU i% pamięci. Pokazuje dane w formacie przyjaznym dla użytkownika.

To polecenie zostało zainspirowane odpowiedzią i bardzo pomogło mi dowiedzieć się, który proces pochłania moje zasoby.

Ashah
źródło