Tatsächliche Speichernutzung eines Prozesses


20

Im Folgenden sind die Speicherauslastung mysqlund apachejeweils auf meinem Server. Gemäß der Ausgabe von pmapsagen wir, mysqlwird unter Verwendung von etwa 379m und apacheist mit 277m.

[root@server ~]# pmap 10436 | grep total
 total           379564K

[root@server ~]# pmap 10515 | grep total
 total           277588K

Vergleicht man dies mit der Ausgabe von top, sehe ich, dass die Werte fast übereinstimmen.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10515 apache    20   0  271m  32m 3132 S  0.0  6.6   0:00.73 /usr/sbin/httpd
10436 mysql     20   0  370m  21m 6188 S  0.0  4.3   0:06.07 /usr/libexec/mysqld --basedir=....

Nun, diese Werte sind definitiv nicht die aktuelle Speicherauslastung dieser beiden Prozesse, da sie ansonsten die 512 MB ramauf meinem System überschritten hätten und ich die Tatsache verstehe, dass dies die Größe der Seiten ist, die diesen beiden Prozessen zugewiesen sind und nicht wirklich die Größe des von ihnen aktiv genutzten Speichers. Wenn wir jetzt verwenden pmap -x, sehe ich eine zusätzliche Spalte, Dirtydie deutlich weniger Speicherbedarf für den Prozess anzeigt. Wie im folgenden Beispiel zu sehen ist, Dirtyzeigt die Spalte 15 M im Gegensatz zu 379 M in der ersten Spalte. Meine Frage ist: Ist der Wert in der Spalte Dirtydie "tatsächliche" Menge an Speicher, die von diesem Prozess aktiv verwendet wird? Wenn dies nicht der Fall ist, wie können wir dann die tatsächliche Speichernutzung eines Prozesses ermitteln? Nicht psund topaus den oben genannten Gründen. Haben wir etwas unter/proc das wird diese Info geben?

[root@server ~]# pmap -x 10436 | grep total
total kB          379564   21528   15340
[root@server ~]#


[root@server ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           489        447         41          0         52        214
-/+ buffers/cache:        180        308
Swap:         1023          0       1023
[root@server ~]#

Verwandte Themen
Quazi Irfan

Antworten:


18

Es gibt keinen Befehl, der die „tatsächliche Speichernutzung eines Prozesses“ angibt, da es keine tatsächliche Speichernutzung eines Prozesses gibt .

Jede Speicherseite eines Prozesses kann (neben anderen Unterscheidungen) sein:

  • Transienter Speicher, der nur von diesem Prozess verwendet wird.
  • Über verschiedene Mechanismen mit anderen Prozessen geteilt.
  • Durch eine Festplattendatei gesichert.
  • Im physischen Speicher oder Swap.

Ich denke, die "schmutzige" Zahl addiert alles, was sich im RAM befindet (nicht tauschen) und nicht durch eine Datei gesichert ist. Dies umfasst sowohl gemeinsam genutzten als auch nicht gemeinsam genutzten Speicher (obwohl der gemeinsam genutzte Speicher in den meisten Fällen, mit Ausnahme von Forking-Servern, nur aus Speicherzuordnungsdateien besteht).

Die von angezeigten Informationen pmapstammen von und . Das ist die tatsächliche Speichernutzung des Prozesses - sie kann nicht durch eine einzelne Zahl zusammengefasst werden./proc/PID/maps/proc/PID/smaps


6

Ich werde etwas zitieren, das ich in der Manpage für eine Anwendung geschrieben habe, die eine Analyse ähnlich der von oben durchführt und Informationen aus denselben Quellen bezieht wie pmap(zB /proc/[N]/maps):

VIRTUAL ADDRESS SPACE VS. PHYSIKALISCHER SPEICHER

Es ist wichtig, den Unterschied zwischen virtuellem Adressraum und physischem Speicher bei der Interpretation einiger der oben genannten Statistiken zu verstehen . Wie der Name schon sagt, ist der virtuelle Adressraum nicht real. Es ist im Grunde eine Karte des gesamten Speichers, der aktuell einem Prozess zugewiesen ist. Die Begrenzung der Größe dieser Zuordnung ist für alle Prozesse gleich (im Allgemeinen 2 bis 4 GB), und sie wird nicht akkumuliert (dh Sie können Dutzende oder Hunderte von Prozessen mit jeweils einer eigenen virtuellen Adresse von 2 bis 4 GB haben auf einem System mit nur 512 MB physischem Speicher ).

Daten können nicht tatsächlich gespeichert oder aus dem virtuellen Adressraum abgerufen werden. reale Daten erfordern realen physischen Speicher. Es ist die Aufgabe des Kernels, eines im Verhältnis zum anderen zu managen. Virtuelle Speicherplatzstatistiken (VirtualSz, Data + Stack und Priv & Write) sind nützlich, um die Struktur eines Prozesses und die Beziehung zur physischen Speichernutzung zu berücksichtigen. In Bezug auf die tatsächlich verwendete RAM-Größe sind die Statistiken des physischen Speichers (ResidentSz, Share und Anteil) zählen.

pmapmeldet Ihnen hauptsächlich Informationen zum virtuellen Adressraum . Ihre Beobachtung, dass "die Werte fast übereinstimmen", topbezieht sich vermutlich auf die VIRT-Zahl, die sich stark von der RES-Zahl unterscheidet. Diese entsprechen genau dem, was ich oben als "VirtualSz" und "ResidentSz" bezeichnet habe (der VIRT ist für virtuell, der RES ist für resident).

Wenn wir jetzt pmap -x verwenden, sehe ich eine zusätzliche Spalte Dirty, die deutlich weniger Speicherbedarf für den Prozess anzeigt. Wie im folgenden Beispiel zu sehen ist, zeigt die Spalte "Dirty" 15 Millionen im Gegensatz zu 379 Millionen in der ersten Spalte. Meine Frage ist: Ist der Wert in der Spalte "Dirty" die "tatsächliche" Menge an Speicher, die von diesem Prozess aktiv verwendet wird?

Nein, aber irgendwie. "Schmutziger" Speicher bezieht sich auf Daten, die von der Festplatte geladen und anschließend geändert wurden. Da es geändert wurde, muss es Teil des residenten Speichers sein, da diese Änderungen derzeit im RAM gespeichert sind. Es ist jedoch nicht gleichbedeutend damit.


Genau. Die 2 bis 4 GB sind jedoch für 32-Bit-Systeme vorgesehen. Die meisten Systeme sind heutzutage wahrscheinlich 64-Bit.
ctrl-alt-delor

3

Virtueller Speicher ist mit Kurzwahlnummern vergleichbar, mit der Ausnahme, dass es 3 Milliarden oder mehr gibt (für 32-Bit-Systeme 4 Milliarden für 32-Bit-Anwendungen im 64-Bit-Kernel, viel mehr für 64-Bit-Anwendungen), und Sie können keine Nummern direkt wählen Kurzwahl zugeordnet werden.

Mehrere Prozesse können unterschiedliche Zuordnungen (Kurzwahlnummern) für dieselbe Adresse (Telefonnummern) haben. Zum Beispiel können sie mehrere Bibliotheken gemeinsam nutzen, haben also virtuelle Adressen für die gesamte Bibliothek (Sie können das in pmap sehen). Sie können sogar dieselbe ausführbare Datei verwenden, z. B. 2 Instanzen von bash.

Bisher erklärt dies, wie das Sub der gesamten virtuellen Adresse passen kann, aber es gibt noch mehr. Ein Prozess kann so viel virtuellen Speicher haben, dass er nicht passen sollte, wie? Einige Teile einer Bibliothek oder einer ausführbaren Datei werden möglicherweise nicht verwendet, sie werden nicht von der Festplatte in den RAM kopiert, oder der RAM wird voll, und Bits, die von der Festplatte geladen wurden, werden gelöscht, da sie bei Bedarf erneut von der Festplatte abgerufen werden können. oder Speicher, der nicht von meiner Festplatte gesichert wurde, wird zum Auslagern zugeordnet, zum Auslagern kopiert und dann gelöscht. Es kann dann bei Bedarf vom Swap gelesen werden. Wenn eine dieser letzteren Strategien zu häufig angewendet wird, wird das System langsam.

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.