Was hat den Linux-Speicher verwendet? Niedriger Cache, niedriger Puffer, keine VM

11

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 topsehe 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

dfmeldet keinen großen Speicherverbrauch von tmpfsDateisystemen.

Jason
quelle
2
Was ist die Ausgabe von ps -eo pid,user,args,pmem --sort pmem?
Braiam
Hier Link eingefügt , ein paar Mal ausprobiert, die gleiche Ausgabe erhalten.
Jason
3
Nicht benutzen head! Ich möchte die vollständige Ausgabe des vollständigen Befehls. Wenn ich wollte, dass du es benutzt, headwürde ich es in meinen Befehl setzen. Bitte geben Sie immer die vollständige Ausgabe an die von den Personen angeforderten Befehle.
Braiam
3
Erinnern Sie sich bei einem Telefon nicht an die Syntax auf der Oberseite meines Kopfes, sondern suchen Sie nach sysv Shared Memory. Befehl ist ipcs, denke ich.
Derobert
5
Haben Sie jemals eine Lösung dafür gefunden? - Ich habe ein ähnliches Problem hier: superuser.com/questions/793192/...
Hackeron

Antworten:

4

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 von top). 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 topund freeusw. 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.

Majenko
quelle
6
Dies ist wirklich interessant, beantwortet aber nicht die Frage, warum das OP diese spezifische Diskrepanz beobachtet.
Terdon
Ich denke, die einzige wirkliche Diskrepanz liegt zwischen den Erwartungen der OP und dem, was Linux bietet. Das heißt, die Werte, die Linux gibt, summieren sich einfach nicht, und das liegt daran, dass sie sich bereits geändert haben.
Majenko
Da das OP die Frage, die er stellt, nicht wirklich zu verstehen scheint, sehe ich nicht, wie eine "richtige" Antwort gewählt werden kann. Wir können erklären, wie das System funktioniert, bis wir blau im Gesicht sind, aber wenn er diese Grundlagen nicht versteht und erkennt, dass seine Frage tatsächlich bedeutungslos ist, werden wir niemals eine "richtige" Antwort haben.
Majenko
Ich weiß das zu schätzen, aber ehrlich gesagt mag ich den Agnostizismus-Ton dahinter nicht. Ich stimme der "Snapshot" -Theorie zu, aber wenn der Snapshot weiterhin dieselbe Zahl enthält, die besagt, dass die RAM-Auslastung hoch ist, während Sie nicht herausfinden können, wie es passiert ist, sind Sie dann nicht neugierig?
Jason
5
Sie sollten dies auf Ihrem Blog veröffentlichen. Es ist gut, aber hier nicht relevant. Es ist etwas Seltsames los (und ich meine, es kommt seltsam von jemandem, der versteht, was Sie geschrieben haben), da das VIRT der Prozesse nicht die gesamte RAM-Nutzung berücksichtigt und das System trotz des Drucks nicht ausgetauscht wird.
Gilles 'SO - hör auf böse zu sein'
0

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.

ssl
quelle
Ich wollte nur hinzufügen, dass ich in der Vergangenheit Erfahrung mit einem System hatte, dem aufgrund einer schlecht geschriebenen Anwendung, die gemeinsam genutzte Speichersegmente zugewiesen, diese jedoch nicht freigegeben hat, der Speicher ausgeht. Die gemeinsam genutzten Speichersegmente blieben bestehen, selbst wenn alle Prozesse, die sie verwendeten, starben. Dies war nicht Linux, aber es könnte auch unter Linux zutreffen. Wie oben erwähnt, siehe ipcs für Informationen dazu. siehe makelinux.net/alp/035 Es heißt, dass Sie den freigegebenen Speicher explizit freigeben müssen.
SSL
1
Ich verstehe nicht alles, worum es in Ihrer Antwort geht, aber "Inaktiver Speicher könnte von Prozessen stammen, die beendet wurden" ist definitiv falsch. Userland-Speicher gibt es in zwei Varianten: zugeordnet oder anonym. Der zugeordnete Speicher kann jederzeit zurückgefordert werden, da die Daten aus einer Datei neu geladen werden können. Anonymer Speicher kann zurückgefordert werden, wenn er ausgetauscht wird. Inaktives Gedächtnis ist ein Gedächtnis, das ein guter Kandidat für die Rückforderung ist. Der Inhalt muss sich jedoch in einer Datei befinden oder irgendwo ausgetauscht werden, da dieser Speicher noch verwendet wird. Wenn ein Prozess stirbt, wird sein Speicher frei und wird nicht mehr als aktiv + inaktiv berücksichtigt.
Gilles 'SO - hör auf böse zu sein'
1
Einige Referenzen: Was kann zu einer Erhöhung des inaktiven Speichers führen und wie kann dieser wiederhergestellt werden? bei Serverfehler; alte, aber immer noch meist zutreffende Tipps von Red Hat . Und der Artikel von Bhavin Turakhia, den Sie ebenfalls zitieren; Es ist nicht explizit in dieser Angelegenheit, aber es erklärt anonyme und zugeordnete Seiten im Abschnitt „Grundlegendes zur PFRA“.
Gilles 'SO - hör auf böse zu sein'
Ich habe den Gedanken zu inaktiven Seiten, auf die von einem Prozess nicht verwiesen wird, aus diesem Artikel erhalten: kernel.org/doc/gorman/html/understand/understand013.html Obwohl ich vermute, dass es Seiten sein könnten, die von einem Prozess freigegeben wurden, der noch läuft. Abschnitt "Zurückfordern von Seiten aus den LRU-Listen"
SSL
Aber möglicherweise bezieht sich das nur auf Seiten im Swap-Cache?
SSL
-2

Verwenden Sie überhaupt NFS?
Es könnte sich lohnen, in slabtop -obeide Richtungen zu laufen , nfs_inode_cacheda dies außer Kontrolle geraten kann.

cjve
quelle
-4

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

Echsecutor
quelle
1
Sie sollten sich keine Sorgen machen, wenn Ihr System auch tauscht, das ist normal. Sie sollten sich Sorgen machen, wenn Ihr System zu oft ausgetauscht wird (was nicht mit einem großen genutzten Auslagerungsbereich identisch ist). Die Tatsache, dass der verwendete Swap 0 ist, ist an sich schon komisch, mit so wenig freiem physischem Speicher.
Gilles 'SO - hör auf böse zu sein'
Nun, seine Ausgabe zeigt an, dass sein System überhaupt nicht getauscht hat. Das ist sicherlich die optimale Swap-Rate. Ich habe nicht gesagt, dass eine kleine Swap-Größe eine gute Sache ist, aber eine Null-Größe ist es sicherlich. Und solange dem System nicht der freie Speicherplatz ausgeht, warum sollte es dann mit dem Austausch beginnen?
Echsecutor
Nein, das Fehlen eines Austauschs ist alles andere als optimal. Der Speicher von Programmen, die derzeit nicht verwendet werden, sollte ausgetauscht werden, um Platz für den Festplatten-Cache für häufig verwendete Dateien zu schaffen. Was das Bit betrifft, das Sie gerade über die Ausgabe von hinzugefügt haben free, haben Sie es gemeint top- aber selbst dann kann die Summe nur mehr als die Summe sein (weil der gemeinsam genutzte Speicher mehrmals gezählt wird), nicht weniger.
Gilles 'SO - hör auf böse zu sein'
Was meinst du mit der Summe kann nur mehr sein, nicht weniger? oben werden nur so viele Prozesse angezeigt, wie auf den Bildschirm passen. Ich bin mir ziemlich sicher, dass bei den oben genannten Prozessen nicht alle Prozesse ausgeführt werden. Daher sind sie nicht nach Speichernutzung sortiert. Diese Ausgabe ist für die Frage "Was hat den Speicher verwendet?" ziemlich nutzlos .
Echsecutor
Oh, und ich möchte keine Debatte darüber führen, wann der optimale Zeitpunkt für den Beginn des Austauschs ist, aber der Standard des Linux-Servers ist, den Speicher nicht nur auszutauschen, weil er "im Moment nicht verwendet wird".
Echsecutor