OOM killerとは? 原因や対処方法、予防策を詳しく解説

Linux系のOSを使用していて、「突然プロセスが停止されてしまった」という経験をされたことはないでしょうか。これはシステムのメモリが枯渇したことで発生する「OOM killer」によって起こったことかもしれません。OOM killerは、サーバーの安定稼働を保つために必要な仕組みです。しかし、突然重要なプロセスが停止してしまうと重大なトラブルの原因ともなりかねません。

この記事では、OOM killerの概要や発生する原因、確認方法、未然に防ぐための方法などについて詳しく解説します。

OOM killerとは

OOM killerとは、Out of Memory Killerの略で、Linuxカーネルに実装されたメモリ管理機能の一つです。システムのメモリが物理的に不足した際に、Linuxカーネルが特定のプロセスを強制終了する機能のことを指します。OOM killerによる強制終了は、大量のメモリを消費している使用効率の悪いプロセスから優先して行われます。

OOM killerが起こる原因

では、なぜOOM killerが発生するのでしょうか。

Linuxカーネルは、サーバー上で実行中のアプリケーションからメモリを要求された際にオンデマンドでメモリを割り当てます。通常このやりとりはプロセス実行の前に行われますが、この時点でメモリが確保されるわけではありません。実際のメモリ割り当ては、アクセスが発生するタイミングまで遅延させます。

これを「遅延アロケーション」と言い、遅延アロケーションによってカーネルはメモリをオーバーコミット(各プロセスに割り当てるメモリの合計が物理的なメモリの上限を超えること)できるようになります。これによって、カーネルはメモリの使用効率を高められるよう設計されています。

通常これは問題になりませんが、もし複数のプロセスが割り当てられたメモリを一度に使用し始めると、メモリ不足になる可能性があります。この場合、カーネルはメモリ不足によりサーバー自体が動作停止するという最悪の事態を防ぐため、OOM killerの機能を利用して一部のプロセスを強制終了させるのです。つまり、OOM killerはサーバーを安定稼働させるために必須の機能と言えます。

OOM killerの確認方法

プロセスが強制終了された時にその原因を確認したい場合、/var/log/messagesにログが出力されます。まずはここを確認しましょう。

$ grep -i kill /var/log/messages*

host kernel: Out of Memory: Killed process (program1)

以上のような出力が得られた場合、メモリ不足が原因でprogram1はOOM killerによって強制終了されたことがわかります。

OOM killerが起きた際の対処方法

では、OOM killerが発生した場合はどのように対処すべきでしょうか。基本的に、OOM killerが発生した場合には強制終了されたプロセスの再起動を行う必要があります。ただし、そもそもメモリが不足している状態であるため、再起動する前にサーバーのキャパシティや動作状況を確認しましょう。

以下のコマンドで、サーバーの高メモリ統計と低メモリ統計を確認できます。

$ free -lh

負荷の高いプロセスがある場合はその対応を行ってから再起動するのがおすすめです。もしサーバーへSSH接続できない場合は、サーバーの再起動を行うしか対処方法はありません。

OOM killerを未然に防ぐには

OOM killerはメモリ不足によって起きるため、事前に対策を行うことで未然に防ぐことができます。重要なプロセスが突然強制終了される事態を避けるため、以下のような対策を日頃から行いましょう。

swap領域を増やす

もしOOM killerの発生原因が一時的なメモリ不足であれば、swap領域を増やすことで回避できる場合があります。しかし、swap領域が不足した場合は破綻するため、swapの使用量を監視しなければなりません。また、慢性的なメモリ不足の場合はこの方法で回避することは難しいです。

メモリを増やす

そもそも、運用したいアプリケーションが必要とするメモリ容量を、低く見積もっている場合があります。この場合はシンプルにメモリ容量を拡張するのがおすすめです。現在のサーバーの稼働状況を確認した上で、必要なメモリ容量を見直して追加しましょう。

OOM killerの優先度を設定する

OOM killerによって強制終了されるプロセスの優先度を事前に設定することができます。デフォルトは0で、優先度を-1000にすることでプロセス停止の対象外とすることも可能です。また、プロセスごとにスコアが計算され、スコアの高いものから順にプロセス停止の対象となります。絶対に停止したら困るプロセスがあり、他のプロセスは一時的に停止しても問題ないという場合には活用できます。

優先度・スコアは以下のコマンドで確認できます。

優先度

/proc/<PID>/oom_score_adj

スコア

/proc/<PID>/oom_score

OOM killerを無効にする(非推奨)

実働環境では推奨されませんが、次のコマンドでOOM killerを完全に無効にすることもできます。

sysctl vm.overcommit_memory=2

echo “vm.overcommit_memory=2” >> /etc/sysctl.conf

しかし、OOM killerが無効の状態でメモリ不足が発生した場合は、サーバーのリソースと構成によっては予期しない動作が発生する可能性があります。たとえばカーネルパニック、システムのハングアップ、システムのクラッシュなどです。そのため、この選択肢を検討する場合はリスクについて十分に把握しておく必要があります。

まとめ

OOM killerは、Linuxカーネルに実装されたメモリ管理機能の一つです。システムのメモリが物理的に不足した際に、Linuxカーネルが特定のプロセスを強制終了します。

サーバーの安定稼働を保つために必要な機能ですが、突然重要なプロセスが終了してしまうとシステムの停止など大きなトラブルを招くリスクもあるでしょう。OOM killerの発生を未然に防ぐには、日頃から対策を行うことが重要です。現在稼働中のシステムのメモリ状況を確認し、適切な対応をしてトラブルを回避しましょう。