Grundlegendes zur Nutzung des virtuellen Speichers> Swap + Physical unter Linux

9

Ich habe einen Prozess, der oben meldet, dass 6 GB residenter Speicher und 70 GB virtueller Speicher zugewiesen sind. Das Seltsame ist, dass auf diesem bestimmten Server nur 8 GB physischer und 35 GB Swap-Speicher verfügbar sind.

Aus dem 'Top'-Handbuch:

   o: VIRT  --  Virtual Image (kb)
      The total amount of virtual memory used by the  task.   It  includes
      all  code,  data  and  shared  libraries  plus  pages that have been
      swapped out. (Note: you can define the STATSIZE=1 environment  vari-
      able  and  the VIRT will be calculated from the /proc/#/state VmSize
      field.)

      VIRT = SWAP + RES.

Angesichts dieser Erklärung würde ich erwarten, dass die Zuweisung des virutalen Speichers für einen Prozess auf meinen verfügbaren Swap + physischen Speicher beschränkt ist.

Laut 'pmap' sind der Code, die gemeinsam genutzte Bibliothek und die gemeinsam genutzten Speicherabschnitte dieses Prozesses minimal - nicht mehr als 300 MB oder so.

Offensichtlich funktionieren die Maschine und der Prozess immer noch korrekt (wenn auch langsam). Was fehlt mir hier?

Bauch
quelle

Antworten:

9

Möglicherweise wird kein Speicher benötigt, der sich nicht im physischen RAM oder in der Auslagerungsdatei befindet.

Einige Ressourcen, die Sie sich ansehen möchten:

Erstellt Ihre Anwendung viele leere Speicherseiten? In diesem Fall kann Ihre Bewerbung von folgenden Vorteilen profitieren:

Sie können damit in Echtzeit-Speicherseiten komprimieren und dekomprimieren. Im Gegenzug können Sie alles im RAM behalten, anstatt auf die Festplatte zu wechseln ( sehr langsam ).

Der Unix-Hausmeister
quelle
Ja, die Anwendung führt viele Korrelationen im IPV4-Bereich durch, sodass je nach Verkehrsverteilung möglicherweise viele leere Seiten vorhanden sind. Wir müssen darauf achten. Vielen Dank!
Bauch
Ich bin froh zu helfen, hoffentlich wird mich ein anderer Benutzer markieren. Ich habe Killer-Antworten, aber ich habe eine Bewertung von 1.266 :-(. Ich glaube nicht, dass Serverfehler Benutzer wie ich hahhah
The Unix Janitor
1
Einige Gründe, warum Personen möglicherweise nicht für Sie stimmen: 1. Formatieren Ihrer Antwort --- Verwenden Sie Markup. 2. Ihr Benutzername scheint generisch zu sein. 3. Am wichtigsten: Die Tatsache, dass Sie es wichtig genug finden, um darüber zu kommentieren. Hinterlässt einen sauren Geschmack im Mund der Menschen.
Belmin Fernandez
@ user37899 Upvotes lassen sich in drei Kategorien einteilen: Wie informativ die Antwort ist, wie gut formatiert und leicht zu lesen ist und wie beliebt die Frage ist. Ich würde an Ihrer Formatierung arbeiten, aber Sie müssen auch etwas Zen haben und erkennen, dass einige fantastische Antworten mit nur einer Gegenstimme auf der Website zu finden sind - die Beliebtheit einer Frage ist der Faktor mit der größten Wirkung.
Jeff Ferland
1
Habe einige Formatierungen vorgenommen. Hoffentlich hilft es heh.
Belmin Fernandez
2

Hier ist eine Diskussion über virtuelles vs. residentes Gedächtnis:

/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

Die Diskussion bezieht sich auf Java-Prozesse, ist jedoch auf alles anwendbar, was unter Linux ausgeführt wird. Der Hauptpunkt in Bezug auf Tugend ist, dass die Summe eine ganze Reihe von Dingen enthält, die möglicherweise nie verwendet werden. Virt ist für 32-Bit-Betriebssysteme eine gute Wahl (da Prozesse den adressierbaren Speicherplatz einschränken), ist aber ansonsten weitgehend nicht nützlich. Wie bereits erwähnt, ist der residente Speicher zu beachten, der auf den verfügbaren physischen RAM und Ihren Swap beschränkt ist.

cjc
quelle
Er fragte tatsächlich, warum der zugewiesene virtuelle Speicher größer sei als sein physischer Speicher + Swap Space.
The Unix Janitor
Ja, und die Diskussion in Stackoverflow spricht darüber, wie das möglich ist.
CJC
1

Dies liegt wahrscheinlich daran, dass der Adressraum des Prozesses die von Ihnen angegebene Größe hat, aber vom Betriebssystem nicht wirklich zugewiesen wird.

Von: http://lwn.net/Articles/428100/

Bei dem Versuch, dieses Ziel zu erreichen: "Niedrig genug Overhead und keine signifikante Latenz", haben die Go-Entwickler einige vereinfachende Annahmen getroffen. Eine davon ist, dass der für eine laufende Anwendung verwaltete Speicher von einer einzigen, praktisch zusammenhängenden stammt Adressbereich. Solche Annahmen können auf dasselbe Problem stoßen, auf das Ihr Editor mit vi gestoßen ist - anderer Code kann Teile in der Mitte des Bereichs zuordnen -, sodass die Go-Entwickler dieselbe Lösung gewählt haben: Sie weisen einfach den gesamten Speicher zu, den sie für erforderlich halten (sie dachten, Zum Zeitpunkt des Starts sollten 16 GB auf einem 64-Bit-System ausreichen.

Das ist also die unelegante Art und Weise, wie Speicherverwaltung manchmal durchgeführt wird - ein kontinuierlicher Adressraum vereinfacht das Freigeben nicht verwendeter Mem.

MichaelS
quelle
0

Die Antwort lautet wahrscheinlich MMAP - die Daten befinden sich auf der Festplatte, befinden sich jedoch "außerhalb" des Austauschs und können nicht mit dem Befehl "free" oder "top" angezeigt werden.

Wenn der Java-Prozess nicht zu kompliziert ist, können Sie versuchen, mit "lsof" zu spielen, um herauszufinden, wo sich die MMAP-Datei befindet. Wenn dieser Java-Prozess jedoch kompliziert ist, ist er schwer zu erkennen.

Nick
quelle
-1

Ich war auch überrascht, dass Linux es Ihnen ermöglicht, mehr virtuellen Speicher zuzuweisen, als physischer Speicher + Swap-Speicher vorhanden ist, aber anscheinend hilft es in typischen Situationen bei der Leistung.

Glücklicherweise gibt es einen Kernel-Tuning-Parameter, mit dem der Speicherabrechnungsmodus umgeschaltet werden kann. Dieser Parameter lautet vm.overcommit_memory und gibt an, welcher Algorithmus zum Verfolgen des verfügbaren Speichers verwendet wird. Der Standardwert (0) verwendet die heuristische Methode und überlastet das virtuelle Speichersystem. Wenn Sie möchten, dass Ihre Programme bei der Zuweisung entsprechende Speicherfehler erhalten, anstatt Ihre Prozesse zufälligen Abbrüchen auszusetzen, sollten Sie diesen Parameter auf 2 setzen.

http://www.linuxjournal.com/article/10678

John Velonis
quelle
Das ist total verwirrt. Durch Overcommit können Sie nicht mehr virtuellen Speicher als physischen Speicher plus Swap-Speicher zuweisen. Sie können dies auch ohne Überbindung tun. (Auf einem Computer mit 2 GB RAM, ohne Swap und ohne Overcommit können Sie beispielsweise eine schreibgeschützte 4-GB-Datei mit 4 GB virtuellem Speicher weiterhin zuordnen.)
David Schwartz