メモリオーバーコミット
Linuxのお話。
多くのプログラムは、使うかどうか分からないけど取り敢えず多めにメモリを確保していることがよくあります。
そういったプログラムが多数動いていると、システム全体のメモリ仕様効率が悪くなってしまいます。
Linuxにはメモリオーバーコミットという機構があり、実メモリ以上のメモリを割り当てることが可能です。
メモリを確保する際には。沢山あるように見せかけておき、実際に使われる段階でメモリを割り当てるようになっています。
メモリオーバーコミットがあると、取り敢えずメモリで失敗することがほぼ無くなります。
mallocの後に確保ができたかどうかチェックしていない様なプログラムでも確保に失敗して例外で落ちるようなことは無いわけです。
実際に実メモリも仮想メモリも足りなくなったときには、OOM Killerという機構が発動します。
カーネルがメモリを十分確保できそうなプロセスを選び、プロセスを強制終了させて空きメモリーを確保します。
OOM Killerが発動すると、終了させられた側のプロセスは意図しない理由で終了されることになります。
いい加減なプログラムを活かして、まともなプログラムも巻き添えで殺してしまうという、なんとも迷惑な機構です。
安定動作の為にはOOM Killerが発動しないように設定したほうがよいでしょう。
OOM Killerの優先順位を変更する
優先順位を-16〜15までの値で書き込みます。低い値ほどOOM Killterの対象となる確率が低くなります。
echo (優先順位) > /proc/(Process ID)/oom_adj
oom_adjを-17にすることでOOM Killerの対象から外すことができます。
echo -17 > /proc/(Process ID)/oom_adj
メモリオーバーコミットを使用しない
vm.overcommit_memoryを2に設定することで、OOM Killerの原因となるメモリオーバーコミットを無効にすることができます。
# sysctl -w vm.overcommit_ratio=99 # sysctl -w vm.overcommit_memory=2
/etc/sysctl.confに記載することで起動時から有効になります。
vm.overcommit_ratio=99 vm.overcommit_memory=2