http://dsas.blog.klab.org/archives/50706324.html
なんと 1G のマシンなのに 3G もの領域を確保することができてしまいました。
Linux の仮想メモリシステムでは、プロセスがメモリを確保する際にはたくさんあるように見せかけておいて、実際にアクセスが発生した時に物理メモリを割り当てています。これは、「念のためいっぱいメモリを確保しておくけど実際はそんなに使わないプロセス」が複数動いているときなどに、ハードウエアリソースを有効活用するための優れた仕組みといえます。それでは、実際にメモリ不足が起きたらどうなってしまうのでしょうか。
ここで登場するのが有名な「OOM Killer」という仕組みです。
Linux が実際にメモリ不足に陥ると、とあるアルゴリズムでいくつかのプロセスを選択し、それを勝手に kill してしまいます。kill されるプロセスは、自分が何故落とされるのかを知る由がありません。つまり、malloc の結果を見てメモリ不足のエラー処理をしていたとしても、実際にその処理が走る事はないのです。Linux 上で動いている全てのプロセスは、システムがメモリ不足になっていても気にせずに動作しつづけてしまい、その裏では OOM Killer がせっせとプロセスを停止しているわけです。
ほほー
メモリ不足が原因で強制的にプロセスが落とされるくらいなら、 DBサーバ自身でメモリ不足を検出してエラー処理をしたほうが安全ではないでしょうか。
カーネル2.6では、以下のコマンドでこの動作を制御することができるようになっています。
# sysctl -w vm.overcommit_ratio=99
# sysctl -w vm.overcommit_memory=2
ほー