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

Wie kann ich die Speichernutzung der einzelnen Prozesse anzeigen, wenn ich ein 'ps -ef' ausführe?

Wie kann ich unter Linux die Speichernutzung jedes Prozesses anzeigen, wenn ich ein ps -ef mache? Ich würde gerne den ‘virtuellen Speicher’, ‘res Speicher’, ‘gemeinsamen Speicher’ jedes Prozesses sehen. Ich kann das über top bekommen, aber ich möchte die gleiche Info in ps -ef, so dass ich die Ausgabe an grep mit meinem Prozessnamen leiten kann.

Antworten (8)

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

Die Antwort von @user26528 berechnet den Speicher nicht ganz korrekt - Sie brauchen die Summe der Mappings in smaps, nicht nur das oberste. Dieses Skript sollte es tun:

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

Ich konnte keine Option für gemeinsam genutzten Speicher finden, aber ich habe Optionen für % des gesamten physischen Speichers und die Menge an Swapspace gefunden, die benötigt würde, um den Prozess auszulagern. Dies und vieles mehr ist in der Manpage für ps dokumentiert.

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

Prozesse nach Speicherverbrauch auflisten

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

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

Die Speicherauslastung durch ps zu erhalten, ist ziemlich unzuverlässig. Wenn Sie einen neueren Kernel haben, sollte dieser /proc/pid#/smaps unterstützen, das Ihnen einige detaillierte Informationen über die Speichernutzung jedes Prozesses liefert. Im Folgenden finden Sie ein ziemlich schmutziges und schnelles Skript, das in einer Schleife jeden geöffneten Prozess durchläuft und die Größe, Rss, Pss und Shared Clean/Dirty-Nutzung ermittelt. Hoffentlich kann es in irgendeiner Weise nützlich sein.

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

können Sie

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

Update:

Der folgende Einzeiler gibt auch Auskunft über den gesamten Speicherverbrauch des aktuellen Benutzers.

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

Ich habe gerade alle Benutzerprozesse sortiert nach dem höchsten Speicherverbrauch in MB so aufgelistet:

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

Sie können statt command= auch comm= verwenden, um den vollständigen Prozesspfad anzuzeigen.

Das = entfernt nur den Spaltentitel.

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

Ich habe festgestellt, dass derselbe Prozess oft mehrere Unterprozesse hat und Sie am gesamten vom Prozess verwendeten Speicher interessiert sind. z.B. startet Google Chrome mehrere Prozesse und Sie möchten den gesamten von Chrome belegten Speicher wissen. Ich fand den folgenden einzeiligen Befehl sehr nützlich

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

Er erledigt viele Dinge, wie die Anzeige des Speichers in MB, die Sortierung nach Speicher und vor allem die Gruppierung nach Befehl. Es gruppiert auch %CPU und %Memory. Er zeigt die Daten in einem benutzerfreundlichen Format an.

Dieser Befehl wurde von dieser Antwort inspiriert und hat mir sehr geholfen, eine Vorstellung davon zu bekommen, welcher Prozess meine Ressourcen beansprucht.

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

Prozesse nach Mem-Nutzung auflisten

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