[Slicehost] OOM Killer(Out Of Memory Killer)の対策

2008.07.10

画像 - [Slicehost] OOM Killer(Out Of Memory Killer)の対策

サーバーの操作中にOOM Killer現象が出てサーバーが落ちます。Slicehostから大量のSWAPが発生していると注意のメールがありました。

何日か悩んでいましたが、とりあえず解決しました。

Slicehostで運用始めたばかりですが、3日連続同じ時間でサーバーが落ちます。

サーバー・SSH共に接続できなくなり、管理画面でステータスをみるとCPUが200越えしてました。どうもMysqlがメモリを使いすぎてる予感。

運用前にも何度か遭遇して、泣く泣くリビルドしたこともありましたが、どうやらOOM Killer(Out Of Memory Killer)と呼ばれる現象だったようです。

Linuxのデフォルトの動作では、プロセスがメモリを要求した場合、総メモリ使用量が実メモリ+swap以上であっても、ある程度許可するようになっている。これは、各プロセスが要求したメモリをすべて使うわけではないという経験的な法則により、できるだけ多くのプロセスを起動するためにそのように動作になっているようである。そのため、あるプロセスが確保できたはずのメモリを使おうとし、実際にメモリが足りない場合カーネルが適当なプロセスを選択し、そのプロセスをkillしてしまうことをOut Of Memory Killerという。

YOチェックス: OOM Killer

OOM Killer現象が出てしまったら

私の場合、SSHもできなくなっているので、管理画面のコンソールを使ってログインします。

すると画面にずらーーーっとout of memory: kill process 2 …の文字が出て作業出来ない状態。

Soft Rebootするも変化なしなので、Head RebootかRescueで一旦サービスを停止してまた開始させます。

OOM Killer対策

参考リンク

  • OOM Killerで重要なプロセスを除外する
  • OOM Killerそのものを停止するか動作を指定

OOM Killerで重要なプロセスを除外する

重要なプロセスを除外するためには、/proc/(プロセスID)/oom_adjに-17を書き込む。 プロセスのIDを調べるにはSSHでTOP実行でプロセスとプロセスIDが出てくる。

top
echo -17 > /proc/(プロセスID)/oom_adj 

OOM Killerの

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

overcommit_memory=2 メモリを監視し、オーバーコミットしないで超過した分はエラーを返す。デフォルトは0。

overcommit_ratio=99は、overcommit_memory=2にしたときに確保できる物理メモリの割合を指定します。〈この場合は99%〉

どれが一番有効なのか

私のサーバーの場合、258Mしかないメモリを、initとMysqlとApacheがいっぱいいっぱい使用してるので、これらを除外してもメモリの使用量は変わらない気がする。同様にオーバーコミットしない設定にしても、限界を超えたときにシステムがシャットダウンしてしまう恐れがあると思うので、最後の方法でやりました。

たぶん場合によってどれが最適かということが違うと思いますのでご参考までに。

追記

あとで動いてるサービスの設定を見直すつもりです。何がメモリを使いすぎてるのかチェックして対策したいと思います。サーバー運用は難しすぐる。

現在はCPU最高20% フリーメモリが1/4位で動作がちょっと遅いですが安定はしています。やっぱりMysqlで重くなるみないなのであとで対策します。

Technorati Tags
Linux Slicehost Ubuntu
TrackBack URL
このエントリのリンクを作成
Comment Form

スタイル指定用の一部の HTMLタグが使用できます。