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

Jak mogę wyświetlić użycie pamięci przez każdy proces, jeśli wykonam 'ps -ef'?

W Linuksie, jak mogę wyświetlić użycie pamięci każdego procesu, jeśli wykonam ps -ef? Chciałbym zobaczyć ‘pamięć wirtualną’, ‘pamięć res’, ‘pamięć współdzieloną’ każdego z postępów. Mogę to uzyskać przez top, ale chcę mieć te same informacje w ps -ef, tak że mogę potokować wyjście do grep z moją nazwą procesu.

Odpowiedzi (8)

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

Odpowiedź @user26528 nie do końca poprawnie oblicza pamięć - potrzebujesz sumy mapowań w smaps, a 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
11
11
11
2010-01-29 07:09:40 +0000

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

Nie znalazłem opcji dla pamięci współdzielonej, ale znalazłem opcje dla % całkowitej pamięci fizycznej i ilości przestrzeni wymiany, która będzie potrzebna do wymazania procesu. To i wiele więcej jest udokumentowane na stronie man dla ps.

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

Lista procesów według wykorzystania pamięci

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

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

Uzyskanie użycia pamięci przez ps jest dość zawodne. Jeśli masz nowszy kernel, powinien on obsługiwać /proc/pid#/smaps, który daje szczegółowe informacje o wykorzystaniu pamięci przez każdy proces. Poniżej znajduje się dość brudny i szybki skrypt do zapętlenia każdego procesu, który jest otwarty i złapać Rozmiar, Rss, Pss i współdzielone czyste / brudne wykorzystanie. Mam nadzieję, że może się to przydać 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
4
4
4
2010-01-29 04:20:47 +0000

można użyć

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

Aktualizacja:

Poniższy one-liner dostarcza również informacji o całkowitym zużyciu pamięci przez aktualnego 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 ten sposób wyszczególniłem wszystkie procesy użytkownika posortowane według największego zużycia pamięci w MB:

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 pokazać pełną ścieżkę procesu.

= usuwa tylko tytuł kolumny.

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

Odkryłem, że wiele razy ten sam proces ma rozwidlające się podprocesy i jesteś zainteresowany całkowitą pamięcią używaną przez proces. np. google chrome uruchamia wiele procesów i chcesz znać całkowitą pamięć zajmowaną przez chrome. Znalazłem poniższą jednolinijkową komendę bardzo użyteczną

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 pokazywanie pamięci w MB, sortowanie po pamięci i głównie grupowanie według komend. Grupuje również %CPU i %memory. Pokazuje dane w przyjaznym dla użytkownika formacie.

Ta komenda została zainspirowana z tej odpowiedzi i bardzo pomogła mi zorientować się, które procesy zajmują moje zasoby.

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

Lista procesów według wykorzystania pamięci

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