Wie kann ich die Speichernutzung jedes Prozesses anzeigen, wenn ich ein 'ps -ef' mache?

24

Wie kann ich unter Linux die Speichernutzung der einzelnen Prozesse anzeigen, wenn ich a mache ps -ef? Ich möchte den "virtuellen Speicher", "res Speicher", "Shared Memory" von jedem Fortschritt sehen. Ich kann das über bekommen top, aber ich möchte die gleichen Informationen, ps -efdamit ich die Ausgabe grepmit meinem Prozessnamen weiterleiten kann.

hap497
quelle

Antworten:

8

Die Speicherauslastung über ps zu ermitteln, ist ziemlich unzuverlässig. Wenn Sie einen neueren Kernel haben, sollte dieser / proc / pid # / smaps unterstützen, was Ihnen einige detaillierte Informationen über die Speichernutzung jedes Prozesses gibt. Im Folgenden finden Sie ein ziemlich unsauberes und schnelles Skript, mit dem Sie alle offenen Prozesse durchlaufen und die Verwendung von Size, Rss, Pss und Shared Clean / Dirty ermitteln können. 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
user26528
quelle
1
Sie sollten die Spalte Größe summieren. Siehe die Antwort von ezsmith unten.
Basil A
11

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

Ich konnte keine Option für den gemeinsam genutzten Speicher finden, habe jedoch Optionen für% des gesamten physischen Speichers und die Menge an Swapspace gefunden, die zum Auslagern des Prozesses erforderlich wäre. Dies und vieles mehr ist in der Manpage für ps dokumentiert.

Justin Smith
quelle
Linux verwendet für jeden Prozess Shared Memory im Arbeitsspeicher, was zu falschen Ergebnissen führen kann, wenn Sie viele Prozesse mit einem großen Shared Memory-Segment verknüpfen. top,, psund ähnliche Programme sind in gleicher Weise davon betroffen.
Peter Eisentraut
Ich weiß, wie Shared Memory funktioniert, aber anscheinend kann ps diese Informationen nicht bereitstellen (oder ich konnte sie zumindest nicht in meiner ps-Dokumentation finden). top oder htop können tatsächlich die Nutzung des gemeinsam genutzten Speichers pro Prozess anzeigen.
Justin Smith
9

Die Antwort von @ user26528 berechnet den Speicher nicht richtig - Sie benötigen die Summe der Zuordnungen in Smaps, nicht nur die 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
Schmied
quelle
Ausgaben: Zeile 16: +: Syntaxfehler: Operand erwartet (Fehlertoken ist "+"). Dies ist die Zeile, die Folgendes enthält: echo "Private $ ((($ pd + $ pc)) kB", läuft unter CentOS 7 .
Basil A
2
@evsmith warum 0,5 zu Pss hinzufügen?
Pete
1
Das Ausführen von 10.000 kleinen Awk-Skripten ist ein gewaltiges Gegenmuster. Sie sollten all dies einfach in ein einziges Awk-Skript umgestalten.
Tripleee
aber dieses script selbst verbraucht zu viel speicher
mehmet riza oz
8

Listen Sie Prozesse nach Speichernutzung auf

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

vasily-vm
quelle
Verwenden Sie ps -e -orss=,pid=,args= | sort -b -k1,1ndiese Option , um die Prozess-ID einzuschließen
Jacob
pskann auf eigene ps -eo rss=,args= --sort +rss
Faust
4

Sie können verwenden

top -n 1
Am.
quelle
3

Listen Sie Prozesse nach Mem-Verwendung auf

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

Jijo John
quelle
3

Aktualisieren:

Der folgende Einzeiler enthält auch Informationen zum Gesamtspeicherverbrauch 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 soeben alle Benutzerprozesse aufgelistet, die nach der höchsten Speichernutzung in MB sortiert sind:

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

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

Das =entfernt nur den Spaltentitel.

Raratiru
quelle
3

Ich habe festgestellt, dass ein und derselbe Prozess einen Fork-Sub-Prozess hat und Sie sich für den gesamten Speicher interessieren, der vom Prozess verwendet wird. zb google chrome startet mehrere prozesse und sie möchten wissen, wie viel speicher von chrome belegt ist. Ich fand unten einen Zeilenbefehl 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

Es kümmert sich um viele Dinge, wie das Anzeigen des Speichers in MB, das Sortieren nach Speicher und hauptsächlich das Gruppieren nach Befehlen. Es gruppiert auch% CPU und% Speicher. Es zeigt Daten in benutzerfreundlichem Format.

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

Ascha
quelle