Ich bin ein bisschen verwirrt über einige der Ergebnisse, die ich von ps und free sehe .
Auf meinem Server ist dies das Ergebnis von free -m
[root@server ~]# free -m
total used free shared buffers cached
Mem: 2048 2033 14 0 73 1398
-/+ buffers/cache: 561 1486
Swap: 2047 11 2036
Nach meinem Verständnis der Speicherverwaltung unter Linux wird die Festplattennutzung im RAM gespeichert, sodass jeder nachfolgende Zugriff schneller erfolgt. Ich glaube, das wird durch die "zwischengespeicherten" Spalten angezeigt. Zusätzlich werden verschiedene Puffer im RAM gespeichert, die in der Spalte "Puffer" angegeben sind.
Wenn ich das richtig verstehe, sollte die "tatsächliche" Verwendung der "verwendete" Wert von "- / + Buffer / Cache" sein, oder 561 in diesem Fall.
Unter der Annahme, dass all dies richtig ist, ist der Teil, der mich wirft, das Ergebnis von ps aux
.
Mein Verständnis der ps
Ergebnisse ist, dass die 6. Spalte (RSS) die Größe in Kilobyte darstellt, die der Prozess für den Speicher verwendet.
Wenn ich diesen Befehl ausführe:
[root@server ~]# ps aux | awk '{sum+=$6} END {print sum / 1024}'
1475.52
Sollte das Ergebnis nicht die "verwendete" Spalte von "- / + Buffer / Cache" sein free -m
?
Wie kann ich die Speichernutzung eines Prozesses unter Linux richtig bestimmen? Anscheinend ist meine Logik fehlerhaft.
htop
Autors auf eine ähnliche Frage teilen, die ich neulichAntworten:
Diese genaue gleiche Frage wurde am gefragt serverfault nur den anderen Tag :-)
Das Linux Virtual Memory System ist nicht ganz so einfach. Sie können nicht einfach alle RSS-Felder addieren und den Wert
used
von erhaltenfree
. Es gibt viele Gründe dafür, aber ich werde ein paar der größten treffen.Wenn sich ein Prozess teilt, werden sowohl das übergeordnete als auch das untergeordnete Element mit demselben RSS angezeigt. Allerdings setzt Linux
copy-on-write
so ein, dass beide Prozesse tatsächlich den gleichen Speicher belegen. Nur wenn einer der Prozesse den Speicher ändert, wird er tatsächlich dupliziert. Dies führt also dazu, dass diefree
Zahl kleiner als dietop
RSS-Summe ist.Der RSS-Wert enthält keinen gemeinsamen Speicher. Da Shared Memory keinem Prozess gehört, wird
top
es nicht in RSS aufgenommen. Dies führt also dazu, dass diefree
Anzahl größer als dietop
RSS-Summe ist.quelle
shmget
odermmap
. Die Benennung um Gedächtnismaterial ist sehr schwierig. Die Verwendung des falschen Wortes an der falschen Stelle kann die Bedeutung eines Satzes völlig durcheinander bringen.Wenn Sie nach Speicherplatznummern suchen, die sich addieren, schauen Sie sich smem an :
Zum Beispiel hier:
Das
PSS
ist auch die interessante Spalte hier, weil sie den gemeinsamen Speicher berücksichtigt.Anders als
RSS
es sinnvoll ist, es zu addieren. Insgesamt erhalten wir hier 654 MB für Userland-Prozesse.Die systemweite Ausgabe informiert über den Rest:
Also 1 GB RAM gesamt = 654 MB Userland-Prozesse + 346 MB Kernel-Mem + 16 MB frei
(geben oder nehmen Sie ein paar MB)
Insgesamt wird ungefähr die Hälfte des Speichers für den Cache verwendet (494 MB).
Bonusfrage : Was ist Userland Cache vs Kernel Cache hier?
Übrigens für etwas visuelles versuchen:
quelle
Ein wirklich gutes Tool,
pmap
das die aktuelle Speichernutzung für einen bestimmten Prozess auflistet:Weitere Informationen dazu finden Sie in der Manpage
man pmap
und unter 20 Linux-Systemüberwachungstools , die jeder SysAdmin kennen sollte . Mit diesen tollen Tools erhalte ich immer Informationen zu meiner Linux-Box.quelle
free
Auskunft.pmap -x PID
Enthält auch eine RSS-Spalte, die oft sehr nützlich ist, um eine Vorstellung davon zu bekommen, woher die RSS-Summe eines Prozesses stammt (wie z. B. über beobachtettop
).Run top, drücke
h
um Hilfe undf
füge dann Felder hinzu. Sie können die folgenden Felder hinzufügen:RSS
Der von der Anwendung verwendete physische SpeicherCODE
Gesamtspeicher, den der ausführbare Code des Prozesses belegtDATA
- Gesamtspeicher (KB) für die Daten und den Stapel eines ProzessesZwischen diesen 3 sollten Sie ziemlich genaue Ergebnisse haben. Sie können auch detailliertere Ersetzungen für Top I empfehlen
htop
oder verwendenatop
.Bearbeiten: Fast vergessen, wenn Sie wirklich detaillierte Informationen wünschen. Suchen Sie die PID und suchen Sie die folgende Datei.
PID=123
cat /proc/123/status
Bearbeiten 2: Wenn Sie es finden können oder das Buch haben:
-hat einen Abschnitt Kapitel 5: Leistungstools: Prozessspezifischer Speicher -es hat viel mehr Informationen als Sie jemals wollen würden.
quelle
ps
gibt an, wie viel Speicher für jeden Prozess benötigt wird. Ein Teil dieses Speichers sind MMAP-Dateien, die im Cache gespeichert werden. Ein Teil dieses Speichers (insbesondere Code) wird mit anderen Prozessen gemeinsam genutzt. Wenn Sie also die RSS-Werte addieren, wird dieser mehrfach gezählt.Es gibt keine richtige Antwort auf die Frage, wie viel Speicher dieser Prozess belegt, da er nicht nur vom Prozess abhängt, sondern auch von der Umgebung. Es gibt viele verschiedene Werte, die Sie möglicherweise als "Speicherauslastung" des Prozesses bezeichnen. Sie stimmen nicht überein oder summieren sich, weil sie verschiedene Dinge zählen.
quelle
Wie andere richtig ausgeführt haben, ist es schwierig, einen Überblick über den von einem Prozess tatsächlich verwendeten Speicher zu bekommen, was mit gemeinsam genutzten Bereichen und mit MMAP-Dateien und so weiter.
Wenn Sie ein Experimentator sind, können Sie Valgrind und Massif ausführen . Dies kann für den Gelegenheitsbenutzer etwas schwierig werden, aber Sie erhalten eine Vorstellung vom Speicherverhalten einer Anwendung im Laufe der Zeit. Wenn eine Anwendung malloc () genau das ist, was sie benötigt, erhalten Sie eine gute Darstellung der tatsächlichen dynamischen Speichernutzung eines Prozesses. Aber dieses Experiment kann "vergiftet" werden.
Um die Sache zu verkomplizieren, können Sie unter Linux Ihren Speicher überbelegen . Wenn Sie Speicher malloc (), erklären Sie Ihre Absicht, Speicher zu verbrauchen. Die Zuweisung erfolgt jedoch erst dann, wenn Sie ein Byte in eine neue Seite Ihres zugewiesenen "RAM" schreiben. Sie können sich das selbst beweisen, indem Sie ein kleines C-Programm wie das folgende schreiben und ausführen:
Führen Sie dies auf einem Computer mit weniger als 16 GB RAM aus, und Sie haben gerade 16 GB Arbeitsspeicher erzielt! (Nein nicht wirklich).
Beachten
top
Sie, dass "VIRT" als 16.004G angezeigt wird,% MEM jedoch 0.0 istFühren Sie dies mit valgrind erneut aus:
Und das Massiv sagt "Summe aller Zuordnungen () = 16 GB". Das ist also nicht sehr interessant.
ABER, wenn Sie es auf einem vernünftigen Prozess ausführen :
Und hier sehen wir (sehr empirisch und mit sehr hohem Vertrauen), dass der Compiler 77 KB Heap zugeteilt hat.
Warum versuchen Sie so hart, nur Heap-Nutzung zu bekommen? Da alle gemeinsam genutzten Objekte und Textabschnitte, die ein Prozess verwendet (in diesem Beispiel der Compiler), nicht besonders interessant sind. Sie sind ein ständiger Aufwand für einen Prozess. In der Tat sind nachfolgende Aufrufe des Prozesses fast "kostenlos".
Vergleichen und kontrastieren Sie auch Folgendes:
MMAP () eine 1 GB-Datei. Ihre VMSize beträgt 1 + GB. Die Größe der residenten Gruppe besteht jedoch nur aus den Teilen der Datei, in denen Sie eine Auslagerung verursacht haben (indem Sie einen Zeiger auf diesen Bereich dereferenzieren). Und wenn Sie die gesamte Datei "lesen", hat der Kernel bis zum Ende möglicherweise bereits die Anfänge ausgelagert (dies ist einfach, da der Kernel genau weiß, wie / wo diese Seiten zu ersetzen sind, wenn sie erneut dereferenziert werden ). In beiden Fällen sind weder VMSize noch RSS ein guter Indikator für die "Speichernutzung". Sie haben tatsächlich nichts malloc () 'ed.
Im Gegensatz dazu Malloc () und berühren Sie VIELEN Speicher - bis Ihr Speicher auf die Festplatte ausgelagert wird. Der zugewiesene Speicher überschreitet jetzt Ihren RSS-Wert. Hier könnte Ihr VMSize Ihnen etwas mitteilen (Ihr Prozess verfügt über mehr Speicher, als sich tatsächlich in Ihrem RAM befindet). Es ist jedoch immer noch schwierig, zwischen freigegebenen VM-Seiten und vertauschten VM-Daten zu unterscheiden.
Hier wird Valgrind / Massif interessant. Es zeigt Ihnen, was Sie absichtlich zugewiesen haben (unabhängig vom Status Ihrer Seiten).
quelle
Versuchen Sie Folgendes: Sie erhalten den gesamten RAM, der von allen in MB ausgeführten Prozessen tatsächlich verwendet wird
quelle
size
gemeldeteps
hat wenig Bezug zur tatsächlichen Speichernutzung. Es ist die virtuelle Größe jedes Prozesses, der nicht unbedingt Speicher zugewiesen wird. Einige Segmente, die zugeordnet sind, sind ebenfalls nicht enthalten.Es zeigt Ihnen, wie viel Speicher Benutzer für Benutzer verwenden.
quelle
Verwenden Sie diesen Befehl, um die Speicherauslastung in% zu ermitteln.
Speicher belegt:
freier Speicher
quelle
grep
werde nur dort sitzen und auf eine Eingabe warten.free -m | grep Mem | awk '{print $3/$2 * 100.0}'