サービスを運用してると、急に人気が出たり、新しくプログラムをデプロイしたりした時に、まれにメモリを食いつぶしてサーバが不安定になってしまうことがあります。その時サーバではOomKillerが動いて、Linuxが自動ででプロセスプロセスをkillしてメモリを確保しようとします。
どのプロセスがやっつけられてしまうかわからないので、サーバがとても不安定になったり挙動不審になったりすることが多いです。今回は、サーバでOomKillerが動いてしまった時の対処方法を紹介します。OSはCentOS 6.5 64Bitです。
■とにかくサーバの再起動しましょう
OomKillerが動くと正直、何が起こるわからないです。どのようなプロセスが停止されて、どんな状況なのかわからないことが多いです。なので、一旦サーバの再起動をしてしまいましょう。サーバが動いている感じがしても、今後の事も考えてサーバを再起動してしまったほうがいいです。
■自動で再起動する
上記のようにOomKillerが動くと、サーバの状態が不明瞭になります。結局、再起動することになるのであれば、自動で再起動するようにしてしまいましょう。/etc/sysctl.confに以下を記述します。これは、メモリがなくなった時にkernel_panicを起こして自動的に再起動をするようにする設定です。
vm.overcommit_memory=1
vm.panic_on_oom=1
kernel.panic=30
そして、以下のコマンドで設定を読み込みします。
sysctl -p
これで、準備は完了です。
■テストしてみる
swapoff -aをしてswapファイルをすべて解除して、以下のコマンドを実行します。以下を実行すると、上記の設定の通り、kernel panicが起こって、30秒経過した後にサーバの再起動が発生します。
この記事で紹介しているように、意図的にサーバに付加をかけてみます。メモリを食い潰す様にしました。数値は適切に変えてください。
stress --vm 2 --vm-bytes 7777M
メモリがなくなると、30秒後に自動的に再起動すると思います。当然ですが、本番サーバやると大変なことになるので、テスト環境でテストをしてください。参考になればと思います。では。