Wie werden Top-Prozesse nach tatsächlicher Speichernutzung sortiert angezeigt?


240

Ich habe einen Server mit 12 GB Speicher. Ein Fragment von oben ist unten gezeigt:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

Das free -mzeigt folgendes:

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

Wenn ich das richtig verstehe, verfügt das System nur über 362 MB verfügbaren Speicher. Meine Frage ist: Wie kann ich herausfinden, welcher Prozess den größten Teil des Speichers verbraucht?

Genau wie Hintergrundinformationen läuft das System 64bit OpenSuse 12.


Antworten:


280

Wiederholen Sie zunächst dieses Mantra für eine Weile: "Nicht verwendeter Speicher ist verschwendeter Speicher". Der Linux-Kernel speichert riesige Mengen an Dateimetadaten und angeforderten Dateien, bis etwas, das wichtiger aussieht, diese Daten herausdrückt. Deshalb kannst du rennen:

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

und lassen Sie die zweite findInstanz mit lächerlicher Geschwindigkeit laufen.

Linux lässt nur ein wenig Speicher "frei", um Spitzen in der Speichernutzung ohne allzu großen Aufwand zu verarbeiten.

Zweitens möchten Sie die Prozesse finden, die Ihr gesamtes Gedächtnis verschlingen. in topVerwendung der in Mden Befehlsspeicher durch Verwendung zu sortieren. Sie können die VIRTSpalte ignorieren , in der nur angegeben ist, wie viel virtueller Speicher zugewiesen wurde und nicht, wie viel Speicher der Prozess verwendet. RESBerichte , wie viel Speicher resident , oder zur Zeit in ram (im Gegensatz zu auf die Festplatte ausgelagert Gegensatz oder eigentlich nie an erster Stelle zugewiesen, trotz Aufforderung).

Da RESjedoch z. B. der /lib/libc.so.6Speicher für fast jeden Prozess einmal gezählt wird, ist dies nicht gerade ein hervorragendes Maß dafür, wie viel Speicher ein Prozess verwendet. Die SHRSpalte berichtet , wie viel Speicher wird geteilt mit anderen Prozessen, aber es gibt keine Garantie , dass ein anderer Prozess tatsächlich teilt - es sharable sein könnte, nur sonst niemand will zu teilen.

Das smemTool soll den Benutzern helfen, besser einzuschätzen, wie viel Speicher wirklich für jeden einzelnen Prozess verantwortlich gemacht werden sollte. Es macht einige kluge Arbeit, um herauszufinden, was wirklich einzigartig ist, was gemeinsam genutzt wird, und passt den gemeinsam genutzten Speicher proportional zu den Prozessen an, die ihn gemeinsam nutzen. smemkann Ihnen helfen zu verstehen, wo Ihr Gedächtnis besser als der topWille ist, ist aber topein ausgezeichnetes erstes Werkzeug.


Wenn also nur die "freie" Spaltenstatistik gelöscht wird und oben nichts anderes angezeigt wird, können wir daraus schließen, dass der Speicher vom Linux-Kernel zum Speichern von Dateisachen zugewiesen wird und den Speicher bei Bedarf anderen Prozessen zur Verfügung stellt.
Al2O3

@ Rubby, das ist wahrscheinlich wahr; Die /proc/meminfound /proc/slabinfo-Dateien beschreiben, wofür der Kernel den Speicher verwendet - das slabtopProgramm ist sehr ähnlich top, zeigt aber, welche der
Plattenzuweiser

Vielen Dank für den Tipp zu 'smem'. Ich möchte, dass Linux etwas RAM "verschwendet", damit mein Computer schnell läuft. Wenn das Finden bei einem zweiten Durchgang etwas länger dauert, ist es in Ordnung. Eine feststeckende Maus und eingefrorene Fenster, während Linux entscheidet, welcher RAM (den es unnötig beansprucht hat) gelöscht und neu zugewiesen werden muss, was ich JETZT mache - oder sogar auf die Festplatte tauscht - ist keine Option. Ich habe 16 GB RAM auf dieser Box, und ich erwarte, dass mehrere GB davon frei und für laufende Anwendungen verfügbar sind.
JosephK

@JosephK, das Bewegen einer Maus hat mehr mit der Planung von Prioritäten und Algorithmen zu tun. Wenn Speicherzuordnungen erforderlich sind, um einen Mauszeiger zu bewegen, stimmt etwas mit der von Ihnen verwendeten Software nicht. :)
Sarnold

2
@JosephK Der Kernel benötigt weniger Zeit, um Speicher von einer Verwendung zur nächsten umzuwandeln, als um freien Speicher zu verwenden. Einer erfordert den Zugriff und die Änderung der freien Liste, der andere nicht. Leider ist dies eine XY-Frage. Das Problem hat mit der Leistung zu tun und hängt möglicherweise überhaupt nicht mit dem Speicherverbrauch zusammen (trotz der Beweise, dass es hilfreich ist, mehr Speicher frei zu machen, was aus komplexeren Gründen als die OP-Verdächtigen sein kann), aber stattdessen fragten sie nach der Analyse der Speichernutzung. Das gibt weniger nützliche Antworten als nach dem eigentlichen Problem zu fragen.
David Schwartz

321

Verwenden Sie den Quick-Tipp mit dem Befehl top unter Linux / Unix

$ top

und dann Shift+ drücken m(dh ein Kapital schreiben M).

Von man top

SORTING of task window
  For compatibility, this top supports most of the former top sort keys.
  Since this is primarily a service to former top users, these commands do
  not appear on any help screen.
    command   sorted-field                  supported
      A         start time (non-display)      No
      M         %MEM                          Yes
      N         PID                           Yes
      P         %CPU                          Yes
      T         TIME+                         Yes

Oder alternativ: Drücken Sie Shift+ fund wählen Sie die zu sortierende Anzeige nach Speichernutzung, indem Sie die Taste ndrücken und dann drücken Enter. Sie sehen den aktiven Prozess nach Speichernutzung sortiert


71
Oder Sie können einfach M( Shift+ m)
Patryk

8
@risnandar gibt es eine Möglichkeit, Speicher in MB und nicht%
anzuzeigen

2
hallo codecowboy, vielleicht kann man sich anschaut , commandlinefu.com/commands/view/3/... für detailiertere Speicher verwendet in meinem Server i Dritte App wie bin mit newrelic.com
risnandar

6
oder einfach top -o mem -O cpu
überspringen

Unter Ubuntu 16 brauchte ich top -o RESansonsten "nicht erkannten Feldnamen 'mem'"
AdamS

37
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10

(Hinzufügen eines numerischen Flags -n zum Sortierbefehl.)


3
ps aux --sort '%mem'
Denken Sie

28

Zuerst sollten Sie eine Erklärung zur Ausgabe vonfree lesen . Fazit: Sie haben mindestens 10,7 GB Speicher, der von Prozessen problemlos verwendet werden kann.

Dann sollten Sie definieren, was "Speichernutzung" für einen Prozess ist (es ist nicht einfach oder eindeutig, vertrauen Sie mir).

Dann können wir vielleicht mehr helfen :-)


Woher hast du 10.7? Aus Puffern / Cache [frei]? Danke für den Link, ich werde ihn lesen.
user3111525

3
Ja. Der Punkt ist, dass der größte Teil des Speichers von Puffern und Cache verwendet wird. Dieser Speicher kann sofort "entleert" werden, wenn ein Prozess mehr Speicher benötigt. Wenn Sie die für Puffer / Cache verwendete Speichermenge von der BENUTZTEN Menge subtrahieren oder zur KOSTENLOSEN Menge hinzufügen, erhalten Sie die Zahlen in der zweiten Zeile, was bedeutet, dass nur 1,3 Gig tatsächlich verwendet werden oder von der anderen gesehen werden Winkel, Sie haben 10,7 Gig leicht verfügbaren Speicher (da Puffer und Cache bei Bedarf insta-Dump können).
Stolsvik

21

Auflisten und Sortieren von Prozessen nach Speichernutzung:

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

7
Oder:ps -e -orss=,args= | sort -nr | head
Kenorb

17

ps aux --sort '%mem'

from procps 'ps (Standard unter Ubuntu 12.04) generiert folgende Ausgaben:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tomcat7   3658  0.1  3.3 1782792 124692 ?      Sl   10:12   0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root      1284  1.5  3.7 452692 142796 tty7    Ssl+ 10:11   3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro      2286  0.3  3.8 1316000 143312 ?      Sl   10:11   0:49 compiz
ciro      5150  0.0  4.4 660620 168488 pts/0   Sl+  11:01   0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb             
ciro      5147  0.0  4.5 660556 170920 pts/0   Sl+  11:01   0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb             
ciro      5142  0.1  6.3 2581944 239408 pts/0  Sl+  11:01   0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]                                                                          
ciro      2386  3.6 16.0 1752740 605372 ?      Sl   10:11   7:38 /usr/lib/firefox/firefox

Hier ist Firefox mit 16% meines Gedächtnisses der Top-Konsument.

Sie könnten auch interessiert sein an:

ps aux --sort '%cpu'

4

Mit den folgenden Schritten können Sie angeben, nach welcher Spalte sortiert werden soll:

Schritte:
* oben
* Shift + F.
* Wählen Sie eine Spalte aus der Liste aus
    zB bedeutet n nach Speicher sortieren,
* Drücken Sie Enter
* OK

1
Duplikat der Antwort von Risnandar oben.
benjaoming

3

Sie können die Speichernutzung anzeigen, indem Sie diesen Code in Ihrem Terminal ausführen:

$ watch -n2 free -m
$ htop

3

So summieren Sie den verwendeten Speicher nach Prozessnamen:

Selbst wenn man sich die größten Einzelprozesse ansieht, wird manchmal immer noch viel Speicherplatz nicht berücksichtigt. Um zu überprüfen, ob viele der gleichen kleineren Prozesse den Speicher verwenden, können Sie einen Befehl wie den folgenden verwenden, der awk verwendet, um den Gesamtspeicher zusammenzufassen, der von gleichnamigen Prozessen verwendet wird:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

zB Ausgabe

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7

0

Genau in dieser Sekunde

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

Kontinuierliche Aktualisierung

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

Ich habe hier auch ein paar Leckereien hinzugefügt, die Sie vielleicht schätzen (oder die Sie vielleicht ignorieren).

-n 1 jede Sekunde ansehen und aktualisieren

-U $(whoami)Nur Ihre Prozesse anzeigen. $ (ein Befehl) wird jetzt ausgewertet

| head -n4 Um nur den Header und 3 Prozesse gleichzeitig anzuzeigen, benötigen Sie häufig nur Werbebuchungen mit hohem Nutzungsgrad

${1-4} sagt mein erstes Argument $1 ich möchte standardmäßig 4 verwenden, es sei denn, ich gebe es an

Wenn Sie einen Mac verwenden, müssen Sie möglicherweise zuerst watch installieren

brew install watch 

Alternativ können Sie eine Funktion verwenden

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

Und Sie können leicht nach CPU sortieren, wenn Sie -mzu-r
jasonleonhard

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.