Der Linux Kernel ist ein Optimist

Manchmal führt zuviel Optimismus zu Problemen. Dies gilt leider auch für den Linux Kernel in seiner Defaulteinstellung ab Version 2.1.27 bis 2.5.30. Damit der Kernel jede Speicheranfrage per malloc() immer(!) positiv beantworten kann, schickt er seine oom-killer los, um der einen „beliebigen“ Prozess abzuschießen. Als Resultat stürzt u.U. dann der gesamte Rechner ab. Beispielsweise mit folgender Meldung:

sw-engine invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0

Call Trace:
[] out_of_memory+0x8e/0x2f3
[] __alloc_pages+0x27f/0x308
[] __do_page_cache_readahead+0x96/0x17b
[...]

Um das Problem zu lösen, sollte das Verhalten des Kernel angepasst werden, damit nicht mehr Speicher vergeben wird, als vorhanden ist. Dazu sollten in der Datei /etc/sysctl.conf (ab Kernel 2.5.30) folgende Zeilen eingetragen werden:

vm.overcommit_memory = 2
vm.overcommit_ratio = 80

Bei älteren Kerneln (2.1.27 – 2.5.30) sollte die Defaulteinstellung von 1 auf 0 gesetzt werden.

Kontrolle des aktuellen Status: echo '/proc/sys/vm/overcommit_memory' 
    ==> 0 : besser, 1 : overcommit aktiv, der OOM-Killer schlägt zu.
echo '0' > /proc/sys/vm/overcommit_memory

Original-Hinweis findet sich unter How to fix the OOM killer crashes under Linux

Eine genauere Erkärung und Funktionsweise findet man unter The Linux Kernel: Memory – 9.6 Overcommit and OOM

Happy Linuxing … 🙂