it-swarm.com.de

Wie funktioniert vm.overcommit_memory?

Wenn ich die Standardeinstellungen verwende:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

Ich kann diese Werte aus der Datei /proc/meminfo Lesen:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Wenn ich jedoch vm.overcommit_memory Von 0 In 2 Ändere, kann ich nicht die gleichen Anwendungen starten, die ich vor der Änderung starten konnte, insbesondere Amarok. Ich musste vm.overcommit_ratio In 300 Ändern, damit das Limit erhöht werden konnte. Wenn ich jetzt Amarok starte, zeigt /proc/meminfo Folgendes:

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

Dieser Computer verfügt nur über 1 GB RAM, aber amarok funktioniert problemlos, wenn vm.overcommit_memory Auf 0 gesetzt ist. Wenn Sie ihn jedoch auf 2 Setzen, muss amarok mehr als 2 GB RAM zuweisen. Ist es ein normales Verhalten? Wenn ja, könnte jemand erklären, warum beispielsweise Firefox (das 4-6x mehr Speicher verbraucht als Amarok) vor und nach der Änderung auf die gleiche Weise funktioniert?

52

Sie finden die Dokumentation unter man 5 proc ( oder unter kernel.org ):

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem‐
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

Die einfache Antwort lautet: Wenn Sie overcommit auf 1 setzen, wird die Bühne so eingestellt, dass ein Programm, das so etwas wie malloc() aufruft, um einen Speicherblock zuzuweisen (man 3 malloc), Immer erfolgreich ist, unabhängig davon, ob Das System weiß, dass es nicht über den gesamten Speicher verfügt, der angefordert wird.

Das zugrunde liegende zu verstehende Konzept ist die Idee des virtuellen Speichers . Programme sehen einen virtuellen Adressraum, der möglicherweise dem tatsächlichen physischen Speicher zugeordnet ist oder nicht. Durch Deaktivieren der Überlastungsprüfung weisen Sie das Betriebssystem an, nur davon auszugehen, dass immer genügend physischer Speicher vorhanden ist, um den virtuellen Speicherplatz zu sichern.

Beispiel

Um hervorzuheben, warum dies manchmal von Bedeutung sein kann, werfen Sie einen Blick auf die Redis-Richtlinien , warum vm.overcommit_memory Dafür auf 1 gesetzt werden sollte.

72
Kyle Brandt

Dies ist eine alte Frage mit einer gut etablierten Antwort, aber ich denke, es gibt noch mehr hinzuzufügen.

Wenn vm.overcommit_memory = 0, Ist der Wert vm.overcommit_ratio Zunächst irrelevant. Der Kernel verwendet einen heuristischen Algorithmus, um Speicher zu überbeanspruchen, sodass Ihrem amarok -Prozess mehr Speicher zugewiesen werden kann, als verfügbar ist.

Wenn Sie vm.overcommit_memory Auf 2 Setzen, wird der Wert vm.overcommit_ratio Relevant. Standardmäßig ist dieser Wert auf 50 Eingestellt, was bedeutet, dass das System nur bis zu 50% Ihres RAM (plus Swap)) zuweist. Dies erklärt, warum Sie dies nicht können Starten Sie Programme, die bei vm.overcommit_memory = 0 in Ordnung waren - da weniger als 500 MB zuweisbarer Speicher vorhanden sind (vorausgesetzt, kein Swap).

Wenn Sie es auf 300 Setzen, erlauben Sie dem System, bis zu 300% Ihres RAM (plus Swap, falls vorhanden) zuzuweisen, weshalb das CommitLimit Wert in /proc/meminfo ist so hoch.

Obwohl vm.overcommit_memory = 2 Normalerweise verwendet wird, um eine Überbindung zu verhindern, verwenden Sie es hier, um den Betrag zu begrenzen, der überbeansprucht werden kann. Das Setzen auf 300 Ist gefährlich, da Ihr System nicht über 5171884 kB Speicher verfügt. Je nachdem, wie viel Swap-Speicherplatz Sie haben, verwendet das System Swap (was langsam ist). oder wird der Speicher insgesamt ausgehen.

Warum amarok mehr Speicher benötigt, wenn vm.overcommit_memory = 2 - dies liegt wahrscheinlich daran, dass amarok am besten mit mehr Speicher funktioniert, aber auch mit weniger. Die Logik des Programms versucht möglicherweise zunächst, 2 GB Speicher zuzuweisen. Wenn dies jedoch fehlschlägt, versuchen Sie es mit 1 GB.

3
d4nyll