OOM Killer発動時にサーバーを再起動する方法

OOM Killer発動時にサーバーを再起動する方法 サーバー

VPSで管理してるWEBサイトの死活監視のアラートメールが届き、ブラウザでチェックしたらサイトが見れない。SSHでログをチェックしたら「httpd invoked oom-killer:」の文字が…。

OOM KillerさんにApache(httpd)のプロセスが強制終了させられたらしい。

更にApacheのログを見たら不審なIPアドレスから大量アクセスの形跡を発見。

とりあえずサーバーを再起動して復旧させた。

今後このような事態の際には強制的にサーバーを再起動してメール通知を行うようにする。

※動作確認環境
CentOS 7.6
Apache 2.4.6

OOM Killerの確認

OOM Killer(Out of Memory Killer)とはサーバーのメモリが枯渇してシステムが必要なメモリを新たに確保できない際に(これをOOMという)、既存のプロセスを強制終了させて空きメモリを確保するというLinuxカーネルの機能。

メモリ不足でOOM Killerが発動した場合は、「oom_score_adj」という値が高い順にプロセスを停止していく。

とりあえず今現在の「oom_score_adj」の優先順位の設定を確認する。

優先順位設定を見てみたところ、Apache(httpd)の優先度はゼロ(0)で全プロセス中一位タイなので真っ先に強制終了させられたんでしょうね。

Apache(httpd)の強制終了優先度を下げる(又は上げる)という手もありますが、このVPSでメモリ不足になる原因はほぼ99.9%Apacheなので、OOM発動時は潔くサーバーを再起動させることにします。

現在のVPSはSSDが主流なのでサーバーの再起動もとても速いですからね。

対策

OOM発動時にサーバーを再起動

OOM発動時にサーバーを再起動させるには以下の手順を踏みます。

  1. OOMが発動したら「カーネルパニック」を発生させる。
  2. 「カーネルパニック」が発生したらサーバーを再起動する。

この設定を行っていきます。

OOMの設定変更

現在のOOMの設定を確認します。

OOM設定の設定ファイルを「/etc/sysctl.d/」以下に作成します。
※ファイル名は「oom_reboot.conf」とします。

【設定内容】
「vm.panic_on_oom=1」でOOM発動時にカーネルパニックを発生させ、「kernel.panic=30」で30秒後にリブートします。

設定を反映させます。

設定が変更されたか確認します。

ちゃんと設定が変更されました。

サーバー再起動時にメール通知を行う設定

OOM Killerの発生頻度やシステムの状況を把握するために、サーバー再起動時にはcronにてメール通知を行う設定も追加します。

「mailx」をインストール

cron設定

これでメールを受信できます。

うむ。これで万全。備えあれば憂い無し。
以上で解決です。

タイトルとURLをコピーしました