Im Folgenden sind die Speicherauslastung mysql
und apache
jeweils auf meinem Server. Gemäß der Ausgabe von pmap
sagen wir, mysql
wird unter Verwendung von etwa 379m und apache
ist 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 ram
auf 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, Dirty
die deutlich weniger Speicherbedarf für den Prozess anzeigt. Wie im folgenden Beispiel zu sehen ist, Dirty
zeigt die Spalte 15 M im Gegensatz zu 379 M 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? Wenn dies nicht der Fall ist, wie können wir dann die tatsächliche Speichernutzung eines Prozesses ermitteln? Nicht ps
und top
aus 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 ~]#
quelle
Antworten:
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:
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
pmap
stammen 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
quelle
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
):pmap
meldet Ihnen hauptsächlich Informationen zum virtuellen Adressraum . Ihre Beobachtung, dass "die Werte fast übereinstimmen",top
bezieht 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).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.
quelle
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.
quelle