メモリオーバーコミット

Linux のメモリ管理サブシステムには「メモリ・オーバーコミット」という機構があり、実装されているメモリ以上の領域を確保できてしまう。

http://dsas.blog.klab.org/archives/50706324.html

1G のマシンなのに 3G もの領域を確保することができてしまう。


では、実際にメモリ不足が起きたらどうなってしまうのか。
ここで登場するのが有名な「OOM Killer」という仕組み。
Linux が実際にメモリ不足に陥ると、とあるアルゴリズムでいくつかのプロセスを選択し、それを勝手に kill してしまう。kill されるプロセスは、自分が何故落とされるのか知る由がない。


MySQLPostgreSQL などの DBサーバでこの機構が動いてくれるのは嬉しいことではない。メモリ不足が原因で強制的にプロセスが落とされるくらいなら、DBサーバ自身でメモリ不足を検出してエラー処理をしたほうがまし。

メモリオーバーコミットの制御

カーネル2.6では、以下のコマンドでこの動作を制御することができる

# sysctl -w vm.overcommit_ratio=99
# sysctl -w vm.overcommit_memory=2

/proc/sys/vm/overcommit_ratio: 確保できる物理メモリの割合を指定する
/proc/sys/vm/overcommit_memory: 2にするとメモリオーバーコミットを許さない


※overcommit_ratio のデフォルト値は 50。指定しないままだと搭載メモリの半分までしか確保できない