Frage Wie funktioniert vm.overcommit_memory?


Wenn ich die Standardeinstellungen verwende:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

Ich kann diese Werte von lesen /proc/meminfo Datei:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Aber wenn ich mich verändere vm.overcommit_memory von 0 zu 2Ich kann nicht die gleichen Anwendungen starten, die ich vor der Änderung starten konnte, insbesondere amarok. Ich musste mich ändern vm.overcommit_ratio zu 300, so könnte die Grenze erhöht werden. Wenn ich jetzt amarok anfange, /proc/meminfo zeigt folgendes an:

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

Diese Maschine hat nur 1GiB RAM, aber amarok funktioniert ohne Probleme vm.overcommit_memory ist auf 0 gesetzt. Aber im Falle der Einstellung auf 2Amarok muss über 2 GB Speicher reservieren. Ist es ein normales Verhalten? Wenn ja, könnte jemand erklären, warum zum Beispiel Firefox (das 4-6x mehr Speicher verbraucht als amarok) vor und nach der Änderung auf die gleiche Weise funktioniert?


41
2018-06-18 17:27


Ursprung




Antworten:


Sie finden die Dokumentation in man 5 proc (oder bei 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 ist, dass das Setzen von overcommit auf 1, die Bühne so einstellen wird, dass wenn ein Programm so etwas aufruft malloc() ein Stück Speicher zuweisen (man 3 malloc), wird es immer erfolgreich sein, unabhängig davon, ob das System weiß, dass es nicht den gesamten angeforderten Speicher haben wird.

Das zugrunde liegende Konzept zu verstehen ist die Idee von virtueller Speicher. Programme sehen einen virtuellen Adressraum, der möglicherweise dem tatsächlichen physischen Speicher zugeordnet ist oder nicht. Indem Sie die Überlassungsüberprüfung deaktivieren, weisen Sie das Betriebssystem an, dass es davon ausgehen soll, dass immer genügend physischer Speicher vorhanden ist, um den virtuellen Speicher zu sichern.

Beispiel

Um zu verdeutlichen, warum dies manchmal von Bedeutung sein kann, werfen Sie einen Blick auf die Redis Führungen Warum? vm.overcommit_memory sollte dafür auf 1 gesetzt werden.


56
2018-06-18 17:49



Aber sollte nicht der Wert von Committed_AS in beiden Fällen gleich sein? - Mikhail Morfikov
@MikhailMorfikov: In der Theorie glaube ich, aber wer weiß, was diese Programme tun. Möchte eine kontrolliertere Umgebung mit einem einfachen Programm sehen, das nur einen Gig Ram über Malloc zuweist. Und führen Sie den Test nach dem Neustart zwischen den Tests. - Kyle Brandt♦
Ok, also bleibe ich bei 0 zur Zeit. - Mikhail Morfikov
@MikhailMorfikov: Ja, praktisch denke ich 0 macht am meisten Sinn. In meiner Umgebung ist das einzige Mal, dass ich 1 aktiviere, für Redis, das tut wo es ist erwartet fragen Sie nach viel mehr Speicher, den es wegen einer fork verwendet (). Das Kind wird ziemlich viele gleiche Speicherseiten benutzen, aber Linux weiß nicht, dass das sicher ist, es muss davon ausgegangen werden, dass 2x Speicher verwendet wird (wenn du mehr erfahren willst): redis.io/topics/faq) - Kyle Brandt♦
sollte nicht die letzte Aussage in Ihrer Antwort wie "durch das Ermöglichen von overcommit" beginnen? weil es auf 1 gesetzt ist, bedeutet das, dass du es zu stark überlisten willst, oder? - asgs