Was bedeutet die Größe des virtuellen Speichers oben?

124

Ich werde ausgeführt top, um die Leistung meines Servers zu überwachen, und 2 meiner Java-Prozesse zeigen einen virtuellen Speicher von bis zu 800 MB - 1 GB an. Ist das etwas schlechtes?

Was bedeutet virtueller Speicher?

Und übrigens, ich habe Swap von 1 GB und es zeigt 0% verwendet. Also bin ich verwirrt.

Java-Prozess = 1 Tomcat-Server + mein eigener Java-Daemon-Server = Ubuntu 9.10 (karmic)

kapso
quelle

Antworten:

142

Virtueller Speicher ist nicht unbedingt Speicher. Wenn ein Prozessspeicher beispielsweise eine große Datei abbildet, wird die Datei tatsächlich auf der Festplatte gespeichert, belegt jedoch immer noch den "Adressraum" im Prozess.

Der Adressraum (dh der virtuelle Speicher in der Prozessliste) kostet nichts. Es ist nicht real. Real ist die Spalte RSS (RES), bei der es sich um den residenten Speicher handelt. Das ist die Menge Ihres tatsächlichen Gedächtnisses, die ein Prozess belegt.

Aber auch das ist nicht die ganze Antwort. Wenn ein Prozess fork () aufruft, wird er in zwei Teile geteilt, und beide teilen zunächst alle ihre RSS. Selbst wenn RSS anfangs 1 GB betrug, würde das Ergebnis nach dem Gabeln zwei Prozesse mit jeweils 1 GB RSS sein, aber Sie würden immer noch nur 1 GB Speicher verwenden.

Noch verwirrt? Folgendes müssen Sie unbedingt wissen: Verwenden Sie den freeBefehl und überprüfen Sie die Ergebnisse vor und nach dem Start Ihres Programms (in der +/- buffers/cacheZeile). Dieser Unterschied besteht darin, wie viel neuen Speicher Ihr neu gestartetes Programm verwendet.

Apenwarr
quelle
2
"Überprüfen Sie die Ergebnisse vor und nach dem Start Ihres Programms", verwenden Sie alternativ USS (Unique Set Size), wie von zurückgegeben smem.
Hubert Kario
Gibt es also ein Tool, das die tatsächliche Menge an verwendetem Speicher angibt, Tools, die nicht von Drittanbietern stammen?
CMCDragonkai
@ CMCDragonkai Ja, kostenlos.
Deviantfan
1
Wenn ich einen Java-Prozess über java -Xmx16g RunLongstarte, der 16 GB Speicher für den Java-Prozess reserviert, dann VIRTscheint es, dass die 16 GB gezählt werden. Was ist in diesem Fall der Typ dieses 16-GB-Speichers, ist das zugeordneter Speicher oder ...?
Eric Wang
1
@EricWang, dieser Speicher ist nicht zugeordnet. Es ist nur eine Aufforderung an das Betriebssystem, Speicher zu reservieren, der möglicherweise später (möglicherweise nie) benötigt wird. (Zumindest) unter Linux ist dies ein mmap-Aufruf mit MAP_NORESERVE- und PROT_NONE-Flags (siehe os :: pd_reserve_memory-Aufrufe anon_mmap: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); Standardmäßig wird kein Speicher zugewiesen - dies erfolgt erst zu einem späteren Zeitpunkt, zu dem das Programm den Speicher wirklich benötigt, um Objektzuweisungsanforderungen zu erfüllen.
Juraj Martinka
23

Von der oberen (1) Manpage:

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.

      VIRT = SWAP + RES.

Wobei RES RESident Memory (physischer Speicher verwendet) bedeutet.

Eigentlich stimmt das nicht mehr. Wenn "Swap" angezeigt wird, umfasst dies auch Dateien, die das Programm in seinem Adressraum zugeordnet hat und die möglicherweise tatsächlich noch echten RAM verbrauchen oder nicht. Dieser Speicher ist dateigesichert, aber nicht wirklich austauschbar.

VIRT enthält auch Seiten, die zugewiesen, aber noch für nichts verwendet wurden. Jede Seite in diesem Status wird der Kernel-Zero-Page zugeordnet (brillantes Konzept - Sie sollten es nachschlagen), damit sie in VIRT angezeigt wird, aber tatsächlich keinen Speicher verbraucht.

Amphetamachine
quelle
2
Nun, das ist interessant, also ist VIRT = SWAP + RES, wie kommt es, dass meine SWAP-Nutzung Null ist, während der virtuelle Speicher für die 2 Java-Prozesse nahe bei 1 GB liegt?
Kapso
im Grunde Top Shows .... Swap: 1048568k insgesamt, 0k verwendet, 1048568k frei, 505728k zwischengespeichert
kapso
15
@ user42159 Diese Antwort ist FALSCH! Es gibt KEIN 'VIRT = SWAP + RES' in der Mannoberseite! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. Schade, dass ich diese Antwort nicht ablehnen kann.
Duleshi
3
Diese Antwort ist falsch. USED ​​= Res + Swap Size (von oben Fields Management, Zugriff durch Drücken der Taste f im oberen Bereich. Auch von der oberen Manpage).
Jason S
15

Ich fand diese Erklärung von Mugurel Sumanariu sehr klar:

VIRTsteht für die virtuelle Größe eines Prozesses, dh die Summe des tatsächlich verwendeten Arbeitsspeichers, des von ihm selbst zugeordneten Arbeitsspeichers (z. B. des RAM der Grafikkarte für den X-Server) und der Dateien auf der Festplatte, die ihm zugeordnet wurden (die meisten) insbesondere gemeinsam genutzte Bibliotheken) und gemeinsam genutzter Speicher für andere Prozesse. VIRT gibt an, auf wie viel Speicher das Programm derzeit zugreifen kann.

RESsteht für die residente Größe, die genau angibt, wie viel physischer Arbeitsspeicher ein Prozess tatsächlich verbraucht. (Dies entspricht auch direkt der% MEM-Spalte.) Dies ist praktisch immer weniger als die VIRT-Größe, da die meisten Programme von der C-Bibliothek abhängen.

SHRGibt an, wie viel von der VIRT-Größe tatsächlich gemeinsam genutzt werden kann (Speicher oder Bibliotheken). Bei Bibliotheken bedeutet dies nicht unbedingt, dass die gesamte Bibliothek residiert. Wenn ein Programm beispielsweise nur einige Funktionen in einer Bibliothek verwendet, wird die gesamte Bibliothek zugeordnet und in VIRT und SHR gezählt. Es werden jedoch nur die Teile der Bibliotheksdatei geladen und gezählt, die die verwendeten Funktionen enthalten unter RES.

Franck Dernoncourt
quelle
Ich würde vielleicht nur umformulieren: "VIRT steht für den Speicher, auf den das Programm derzeit zugreifen kann." zu etwas wie "VIRT repräsentiert die Größe des gesamten adressierbaren Raums des Programms im gegenwärtigen Moment." OK, das könnte noch polnisch sein. Aber der Punkt ist, "wie viel Speicher" kann immer noch den Eindruck erwecken, dass es sich um RAM handelt, wenn VIRT nichts mit RAM-Speicher zu tun hat. In der Tat haben große Programme oft eine VIRT-Größe, die mehrere MULTIPLE der gesamten RAM-Größe des Systems ausmacht - da es sich bei dieser VIRT fast ausschließlich um dateibasierte Adressbereiche handelt (AKA "disk not RAM").
Ferd
5

Die VIRT-Spalte in der Ausgabe von ps / top ist für die Messung der Speichernutzung nahezu irrelevant. Mach dir keine Sorgen. Apache VIRT gegen RES-Speicher

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

Leonbloy
quelle
Vielen Dank, ich war besorgt und verwirrt, denn während die Auslagerungsrate 0% betrug, ist die Spalte für den virtuellen Speicher sehr hoch. Und außerdem habe ich nur 1,7 GB des gesamten physischen Speichers von 2,7 GB verwendet, während der virtuelle Speicher hoch ist?
Kapso
2

Linux unterstützt virtuellen Speicher, d. H. Eine Festplatte als Erweiterung des Arbeitsspeichers, sodass die effektive Größe des nutzbaren Arbeitsspeichers entsprechend zunimmt. Der Kernel schreibt den Inhalt eines derzeit nicht verwendeten Speicherblocks auf die Festplatte, damit der Speicher für einen anderen Zweck verwendet werden kann. Wenn der ursprüngliche Inhalt erneut benötigt wird, wird er in den Speicher zurückgelesen. Dies alles wird für den Benutzer vollständig transparent gemacht; Programme, die unter Linux ausgeführt werden, sehen nur den größeren verfügbaren Speicher und bemerken nicht, dass sich Teile von ihnen von Zeit zu Zeit auf der Festplatte befinden. Das Lesen und Schreiben der Festplatte ist natürlich langsamer (in der Größenordnung von tausendmal langsamer) als die Verwendung von echtem Speicher, sodass die Programme nicht so schnell ausgeführt werden. Der Teil der Festplatte, der als virtueller Speicher verwendet wird, wird als Swap Space bezeichnet.

Linux kann entweder eine normale Datei im Dateisystem oder eine separate Partition für den Auslagerungsspeicher verwenden. Eine Auslagerungspartition ist schneller, es ist jedoch einfacher, die Größe einer Auslagerungsdatei zu ändern (es ist nicht erforderlich, die gesamte Festplatte neu zu partitionieren und möglicherweise alles von Grund auf neu zu installieren). Wenn Sie wissen, wie viel Auslagerungsspeicher Sie benötigen, sollten Sie sich für eine Auslagerungspartition entscheiden. Wenn Sie sich jedoch nicht sicher sind, können Sie zuerst eine Auslagerungsdatei verwenden und das System eine Weile verwenden, damit Sie ein Gefühl dafür bekommen, wie viel Auslagerungsspeicher Sie benötigen müssen, und dann machen Sie eine Swap-Partition, wenn Sie über die Größe sicher sind.

Sie sollten auch wissen, dass Linux es einem erlaubt, mehrere Swap-Partitionen und / oder Swap-Dateien gleichzeitig zu verwenden. Dies bedeutet, dass Sie, wenn Sie nur gelegentlich ungewöhnlich viel Auslagerungsspeicher benötigen, zu diesen Zeiten eine zusätzliche Auslagerungsdatei einrichten können, anstatt die gesamte zugewiesene Menge zu behalten.

Anmerkung zur Betriebssystemterminologie: In der Informatik wird normalerweise zwischen Auslagerung (Auslagerung des gesamten Prozesses) und Paging (Auslagerung von Teilen mit fester Größe, in der Regel jeweils einige Kilobyte) unterschieden. Paging ist normalerweise effizienter, und genau das macht Linux, aber die traditionelle Linux-Terminologie spricht ohnehin vom Tauschen.

Quelle: http://www.faqs.org/docs/linux_admin/x1752.html

user42198
quelle
1
Diese Antwort verbreitet das Missverständnis, dass virtueller Speicher mit Auslagerung oder Paging identisch ist. Die Verwendung von Festplatten als RAM-Erweiterung geht dem virtuellen Speicher voraus. Und es gibt viele Systeme (wie die meisten SoHo-Router), die über virtuellen Speicher verfügen, jedoch keine Festplatte als RAM-Erweiterung verwenden. (Und dies ist auch nicht die Antwort auf die Frage des OP, da er keinen Swap verwendet.)
David Schwartz
2

VIRtualDie obere Spalte bezieht sich auf den Super-Space (Super-Consum-Space) des Prozesses, den der Prozess zur Laufzeit möglicherweise nicht tatsächlich einnimmt. Zur RESidentLaufzeit gibt es eine weitere Spalte , die sich auf den tatsächlich vom Prozess zugewiesenen physischen Speicher bezieht.

Der Grund für den Unterschied zwischen den beiden kann anhand des Beispiels verstanden werden: Wenn der Prozess eine bestimmte Bibliothek verwendet, hilft auch die Bibliotheksgröße dem virtual-size. da jedoch nur ein Teil der Bibliothek verwendet wird (dh einige Methoden in Gebrauch sind), hilft dies resident-size.

Siehe für Mehr Infos

Parasrish
quelle
0

"VIRT" ist nur der Adressraum, RES ist der "echte" Speicher, aber die "SHR" (= shared) Menge von "RES" ist der Teil von RES, der mit anderen Prozessen geteilt wird. Daher glaube ich, dass Sie durch Subtrahieren von SHR von RES für die meisten Prozesse die Speicherkapazität erhalten, die diesem bestimmten Prozess tatsächlich zuzuordnen ist.

Max
quelle