Zunächst einmal habe ich LinuxAteMyRAM gelesen , was meine Situation nicht erklärt.
# free -tm
total used free shared buffers cached
Mem: 48149 43948 4200 0 4 75
-/+ buffers/cache: 43868 4280
Swap: 38287 0 38287
Total: 86436 43948 42488
#
Wie oben gezeigt, -/+ buffers/cache:
zeigt die Zeile an, dass die verwendete Speicherrate sehr hoch ist. Aus der Ausgabe von top
sehe ich jedoch keinen Prozess, der mehr als 100 MB Speicher verwendet.
Also, was hat die Erinnerung genutzt?
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28078 root 18 0 327m 92m 10m S 0 0.2 0:25.06 java
31416 root 16 0 250m 28m 20m S 0 0.1 25:54.59 ResourceMonitor
21598 root -98 0 26552 25m 8316 S 0 0.1 80:49.54 had
24580 root 16 0 24152 10m 760 S 0 0.0 1:25.87 rsyncd
4956 root 16 0 62588 10m 3132 S 0 0.0 12:36.54 vxconfigd
26703 root 16 0 139m 7120 2900 S 1 0.0 4359:39 hrmonitor
21873 root 15 0 18764 4684 2152 S 0 0.0 30:07.56 MountAgent
21883 root 15 0 13736 4280 2172 S 0 0.0 25:25.09 SybaseAgent
21878 root 15 0 18548 4172 2000 S 0 0.0 52:33.46 NICAgent
21887 root 15 0 12660 4056 2168 S 0 0.0 25:07.80 SybaseBkAgent
17798 root 25 0 10652 4048 1160 S 0 0.0 0:00.04 vxconfigbackupd
Dies ist eine x86_64-Maschine (kein Server einer gemeinsamen Marke), auf der x84_64 Linux ausgeführt wird, kein Container in einer virtuellen Maschine. Kernel ( uname -a
):
Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Inhalt von /proc/meminfo
:
MemTotal: 49304856 kB
MemFree: 4066708 kB
Buffers: 35688 kB
Cached: 132588 kB
SwapCached: 0 kB
Active: 26536644 kB
Inactive: 17296272 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 49304856 kB
LowFree: 4066708 kB
SwapTotal: 39206624 kB
SwapFree: 39206528 kB
Dirty: 200 kB
Writeback: 0 kB
AnonPages: 249592 kB
Mapped: 52712 kB
Slab: 1049464 kB
CommitLimit: 63859052 kB
Committed_AS: 659384 kB
PageTables: 3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
df
meldet keinen großen Speicherverbrauch von tmpfs
Dateisystemen.
ps -eo pid,user,args,pmem --sort pmem
?head
! Ich möchte die vollständige Ausgabe des vollständigen Befehls. Wenn ich wollte, dass du es benutzt,head
würde ich es in meinen Befehl setzen. Bitte geben Sie immer die vollständige Ausgabe an die von den Personen angeforderten Befehle.Antworten:
Speicher unter Linux kann ein seltsames Tier sein, das diagnostiziert und verstanden werden muss.
Im Normalbetrieb wird Ihr Speicher meistens der einen oder anderen Aufgabe zugewiesen. Einige werden den aktuell ausgeführten Vordergrundprozessen zugeordnet. Einige speichern Daten, die von der Festplatte zwischengespeichert werden. Einige enthalten Daten, die mit Prozessen verknüpft sind, die zu diesem bestimmten Zeitpunkt nicht aktiv ausgeführt werden.
Ein Prozess unter Linux verfügt über einen eigenen virtuellen Adressraum (VIRT in der Ausgabe von
top
). Diese enthält alle mit dem Prozess verbundenen Daten und kann als "groß" des Prozesses angesehen werden. Es ist jedoch selten, dass der gesamte Speicher aktiv Teil der "realen" Speicherzuordnung ist (RES in der Ausgabe vontop
). Das RES oder der residente Speicher sind die Daten, auf die zum Zeitpunkt des Zugriffs direkt im RAM zugegriffen werden kann. Darüber hinaus gibt es noch Shared Memory (SHR). Dies kann von mehreren Instanzen desselben Prozesses gemeinsam genutzt werden. Der von einem Prozess verwendete Speicher befindet sich also zu einem beliebigen Zeitpunkt RES plus SHR. Wenn jedoch mehr als eine Instanz des Prozesses den gemeinsam genutzten Speicher verwendet, wird RES plus RES plus RES ... plus SHR verwendet.Warum also der Unterschied zwischen RES und VIRT? Wenn ein Prozess einen Block mit zugewiesenem Speicher hat, ist ihm doch Speicher zugewiesen, nicht wahr? Nein. Der Speicher wird in Seiten zugewiesen, und die Seiten können entweder aktiv oder inaktiv sein. Aktive sind das, was in RES ist. Inaktiv sind "der Rest". Sie können zur Seite geschoben werden, da sie momentan nicht zugänglich sind. Das heißt, sie können auf die Festplatte ausgelagert werden, wenn der Speicher knapp wird. Aber sie gehen nicht einfach direkt auf die Festplatte. Zuerst sitzen sie in einem Cache. Sie möchten nicht die ganze Zeit tauschen, daher gibt es einen Puffer zwischen der Anwendung und dem Tauschbereich. Diese Puffer ändern sich ständig, wenn der Swapper einen anderen auszuführenden Prozess auswählt und verschiedene Seiten aktiv und inaktiv werden. Und all das passiert viel zu schnell, als dass ein bloßer Mensch mithalten könnte.
Und obendrein gibt es die Plattenpuffer. Der inaktive Speicher wird nicht nur in einen Cache verschoben, sondern wenn dieser Cache auf die Festplatte ausgelagert wird, wird er zuerst in einen Festplattenpuffer verschoben, um zum Schreiben in die Warteschlange gestellt zu werden. Das ist also eine zweite Cache-Schicht in der Mischung. Diese Plattenpuffer werden auch von anderen Teilen des Systems für die allgemeine E / A-Pufferung verwendet. Sie ändern sich also auch ständig.
Was Sie also in Dingen wie
top
undfree
usw. sehen, sind entweder sofortige Momentaufnahmen des aktuellen Status der Maschine oder aggregierte Statistiken über einen bestimmten Zeitraum. Wenn Sie die Daten gelesen haben, sind sie veraltet.Jeder Prozess kann auf große Mengen des Speichers zugreifen, dies ist jedoch selten sinnvoll. Es kann ohnehin nicht auf den gesamten Speicher gleichzeitig zugreifen, sodass der aktuell nicht betrachtete Speicher in den Cache verschoben wird, es sei denn, er ist ausdrücklich als "im Kern gesperrt" gekennzeichnet.
Die von einer Anwendung "verwendete" Speichermenge und die von ihr "vorhandene" Speichermenge sind also zwei völlig verschiedene Dinge. Ein Großteil des Anwendungsdatenbereichs befindet sich tatsächlich im Cache, nicht im "Kern" -Speicher. Da sich der Cache jedoch die meiste Zeit im RAM befindet, ist er sofort verfügbar und muss nur "aktiviert" werden, um zum "Kern" -Speicher zu werden. Es sei denn, es wurde auf die Festplatte ausgelagert, wenn es dann entfernt werden muss (was schnell sein kann, wenn es sich im Puffer befindet).
Aufgrund der hohen Geschwindigkeit des Tieres und der Tatsache, dass sich die Zahlen ständig ändern, können sich die Zahlen sogar teilweise ändern, indem sie berechnen, was sie sind. Daher kann man nie genau sagen, "wie viel Speicher verwendet wird" die Perspektive eines Benutzers. Die Meminfo ist eine Momentaufnahme der vom Kernel bereitgestellten Zeit. Da jedoch der Kernel ausgeführt wird, zeigt sie nicht unbedingt den tatsächlichen Status eines jeden Speichers an, da zu diesem Zeitpunkt kein Prozess aktiv ausgeführt wird - er befindet sich zwischen Prozessen.
Wie ich schon sagte, es ist alles sehr verwirrend.
Aber am Ende des Tages spielt es wirklich keine Rolle. Was zählt, ist nicht, wie viel Speicher Sie "frei" haben, sondern wie viel Swap-Speicherplatz Sie verwendet haben und wie oft auf Swap-Speicherplatz zugegriffen wird. Es ist ein Austausch, der ein System verlangsamt, nicht ein Mangel an Speicher (obwohl ein Mangel an Speicher zu einem übermäßigen Austausch führt). Wenn Sie viel verwendeten Speicher haben, aber keinen (oder nur sehr wenig) Swap-Speicherplatz verwenden, sind die Dinge normal. Freier Speicher ist im Allgemeinen nicht wünschenswert und oft ohnehin nur vorübergehend, da er für einen Zweck verwendet wurde, aber noch nicht für einen anderen zugewiesen wurde - zum Beispiel war es Cache-Speicher und er wurde auf die Festplatte ausgelagert. Es wurde jedoch noch nicht für andere Zwecke verwendet, oder es handelte sich um Festplattenpuffer. Die Puffer wurden auf die Festplatte geleert, aber noch keine Anwendung hat sie für den Cache angefordert.
quelle
Dies ist ein Teil der Antwort:
Es gibt einen Unterschied zwischen dem als "Verwendeter" Speicher bezeichneten Speicher (im Befehl "Frei") und dem "Speicher, der aktiven (Benutzer-) Prozessen zugewiesen ist" (in / proc / meminfo). Ok, Ihr System hat also insgesamt 48149 MB (ca. 47 GB).
Wenn Sie sich Ihre / proc / meminfo ansehen, sehen Sie: Inaktiv: 17296272 kB = (ca. 16,5 GB) - Inaktiver Speicher kann von Prozessen stammen, die beendet wurden. Es kann sich auch um einen Speicher handeln, der lange Zeit nicht von einem aktiven Prozess verwendet wurde. Der Speicher wird nicht "freigegeben", nur weil der Prozess beendet wurde. Warum? weil es mehr Arbeit ist. Dieselbe Speicherseite wird möglicherweise erneut verwendet, sodass der Linux-Kernel die Daten nur in der Liste "inaktiv" belässt, bis ein Prozess sie benötigt.
Diese Seite erklärt einige davon. http://careers.directi.com/display/tu/Understanding+and+optimizing+Memory+utilization ; Lesen Sie den Abschnitt über den vom Linux-Kernel verwendeten PFRA (Page Frame Reclaiming Algorithmus): "Seiten in Festplatten- und Speichercaches, auf die von keinem Prozess verwiesen wird, sollten zurückgefordert werden, bevor Seiten, die zu den Adressräumen des Benutzermodus der Prozesse gehören," "Reclaiming". bedeutet, sie aus "gebraucht" (inaktiv + aktiv) in "frei" zu verschieben.
Dies erklärt die Speicherverwaltung ausführlicher: Wie aktive und inaktive Listen funktionieren und wie Seiten zwischen ihnen verschoben werden https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf
Ich glaube, dass der Kernel auch Speicher für Datenstrukturen verwendet, und dass dies als "slab 1049464 kb" (~ 1 GB) angezeigt wird, glaube ich, aber ich bin nicht sicher, dass dies separat gezählt wird.
quelle
Verwenden Sie überhaupt NFS?
Es könnte sich lohnen, in
slabtop -o
beide Richtungen zu laufen ,nfs_inode_cache
da dies außer Kontrolle geraten kann.quelle
Die Zahl, die Sie sich ansehen sollten, wird als Swap verwendet . In Ihrer Ausgabe ist dies "0", was bedeutet, dass Ihnen NICHT der RAM ausgeht. Solange Ihr System keinen Speicher austauscht, sollten Sie sich keine Gedanken über die anderen Zahlen machen, die ohnehin sehr schwer zu interpretieren sind.
Edit: Ok, es scheint, dass meine Antwort eher als kryptisch als als prägnant angesehen wird. Lassen Sie mich das näher erläutern.
Ich denke, das Hauptproblem hier ist die Interpretation der Ausgabe von top / ps, was nicht sehr genau ist. Da beispielsweise mehrere Verwendungen derselben gemeinsam genutzten Bibliotheken nicht wie erwartet berechnet werden, siehe z. B. http://virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.html
Was jedoch absolut genau ist, ist, dass wenn die Swap-Größe genau Null ist, Ihr System (noch) nicht über genügend Speicher verfügt. Das ist natürlich eine sehr wichtige Aussage, aber für die Profilerstellung der tatsächlichen Speichernutzung Ihres Systems ist top nicht das Richtige. (Und wenn Sie oben schauen, sortieren Sie zumindest die Ausgabe nach virt oder% mem.)
Siehe auch http://elinux.org/Runtime_Memory_Measurement
quelle
free
, haben Sie es gemeinttop
- aber selbst dann kann die Summe nur mehr als die Summe sein (weil der gemeinsam genutzte Speicher mehrmals gezählt wird), nicht weniger.