Das System denkt, es wird getauscht, aber nicht

0

Ich habe einen Linux-Server (Ubuntu 10.04), der keinen Swap-Speicher hat (swapon -l meldet nichts, 0kb Swap-Speicher in / proc / meminfo). Der Anfang der Ausgabe von top (sortiert nach% mem) wird unten wiedergegeben:

top - 04:18:28 up  7:31,  2 users,  load average: 0.93, 0.76, 0.71
Tasks:  25 total,   2 running,  23 sleeping,   0 stopped,   0 zombie
Cpu(s): 15.0%us,  0.8%sy,  0.0%ni, 84.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4195200k total,  4177028k used,    18172k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
30075 admin     20   0 4026m 1.4g 9648 S   31 35.7 271:03.97 2.5g java
 7700 root      15   0  170m 9152 4360 S    0  0.2   0:00.96 161m apache2
 7730 www-data  15   0  171m 6268 1168 S    0  0.1   0:00.00 165m apache2
 7726 www-data  15   0  171m 6232 1108 S    0  0.1   0:00.01 165m apache2
 9520 www-data  15   0  171m 6228 1100 S    0  0.1   0:00.00 165m apache2

Meine Verwirrung ist, wie 4 GB Arbeitsspeicher mit nur etwa 40% der angegebenen Auslastung verwendet werden könnten (ps stimmt mit diesen Zahlen überein). Außerdem bin ich verwirrt darüber, wie mehr virtueller Speicher zugewiesen werden könnte, als sich dort befindet, wenn kein Auslagerungsspeicher vorhanden ist.

Wie bereits berichtet, ist kein freier Speicher verfügbar. Apt-get ist aufgrund einer schlechten Zuordnung fehlgeschlagen. Das verwirrt mich auch, da ich dachte, der OOM-Killer wäre in Aktion getreten, bevor dies passieren könnte.

Zack Bloom
quelle

Antworten:

2

Die Nummer in der Spalte VIRT bedeutet nicht, dass der gesamte Speicher nicht verwendet wird, sondern nur als zugewiesen markiert ist. Java-Programme neigen dazu, viel virtuellen Speicherplatz zu reservieren.

Manchmal kann das etwas chaotisch sein; Standardmäßig erlaubt der Linux-Kernel es Programmen, Speicher zu überlasten, dh mehr Speicher zuzuweisen, als im System verfügbar sind. Dies ist in etwa dasselbe wie bei E-Mail-Anbietern, die Ihnen Gigabyte und Gigabyte an freiem E-Mail-Speicherplatz zur Verfügung stellen, da sie wissen / hoffen, dass nicht jeder wirklich so viel Speicherplatz verwendet, sondern nur einen Bruchteil davon.

Wie viel Überbeanspruchung ist zulässig? In typischen Distributionen wird standardmäßig der vm.overcommit_memory=0Modus verwendet, was bedeutet, dass der Linux-Kernel einige Heuristiken verwendet, um diese Menge zu bestimmen. Überprüfen Sie den jetzt eingestellten Wertsysctl vm.overcommit_memory

Wenn dies 0 ist und Sie das Verhalten des Kernels so ändern möchten, dass "Keine Überschreibung zulassen" angezeigt wird, fügen Sie diese Zeilen zu /etc/sysctl.conf hinzu :

vm.overcommit_memory=2
vm.overcommit_ratio=0

Nachdem Sie den Befehl gegeben haben, werden sudo sysctl -pdie neuen Einstellungen geladen.

Aber was bedeuten diese Zeilen?

vm.overcommit_memory=2 Ändert das Überfestschreibungsmodell von Heuristik in benutzerdefinierbaren Wert.

vm.overcommit_ratio=0ist der Prozentsatz des Arbeitsspeichers, der überlastet werden darf. Null bedeutet, dass kein Over-Commit zulässig ist.

Aber wenn Sie stattdessen etwa 2 Gigabyte zu viel Commit in Ihrem Fall zulassen möchten, dann

vm.overcommit_memory=2
vm.overcommit_ratio=50

würde das tun.

Janne Pikkarainen
quelle
Vielen Dank für Ihre Antwort, aber meine Frage bezog sich eher darauf, wohin mein physisches Gedächtnis führen würde. Basierend auf der Spitze werden nur etwa 1,5 GB für Prozesse zugewiesen, jedoch werden alle 4 GB verwendet. Darüber hinaus werden Java 2,5 GB Auslagerungsspeicher zugewiesen, es ist jedoch kein Auslagerungsspeicher im System vorhanden.
Zack Bloom
Siehe Befehl slabtop- besonders wenn Sie ein XFS-Dateisystem haben, kann es den Speicher effektiv so nutzen, wie er von Ihnen verborgen wird. Und in Linux kann Swap mehr sein als nur die Swap-Partition. Hast du 32 oder 64 Bit Ubuntu?
Janne Pikkarainen
Und die Verwendung von 1,4 GB Arbeitsspeicher und 2,5 GB Swap-Speicher für Ihren Java-Prozess summiert sich auf 3,9 Gigabyte, das wäre der gesamte Arbeitsspeicher. Da also kein tatsächlicher Auslagerungsspeicher verfügbar ist, verwendet Ihr System höchstwahrscheinlich RAM zum "Auslagern". Ich vermute, Ihre Java-Anwendung hat viele inaktive Seiten, die der Kernel irgendwo austauschen möchte.
Janne Pikkarainen
Ah, ich habe nicht in Betracht gezogen, dass es sich um Daten handeln könnte, die wie im Swap-Bereich ausgetauscht werden. Danke für Ihre Hilfe.
Zack Bloom