はじめに
Linuxシステムは、OSの核となるカーネルを中心に、システムライブラリ、システムユーティリティ、ユーザー空間、サービスやデーモンといった複数の層から構成されています。
この記事では、その中でもLinuxカーネルのメカニズムの一つであるoom_killerについて解説します。
oom_killerとは
oom_killer(Out of Memory Killer)は、Linuxカーネルのメカニズムの一つで、システムメモリが不足したときに特定のプロセスを終了させることで、システム全体の安定性を維持します。
メモリ不足が発生すると、oom_killerはどのプロセスを終了させるかを決定するために以下の基準を使用しています。
- プロセスのメモリ使用量
-
多くのメモリを使用しているプロセスは、終了させることで多くのメモリを解放できるため、選ばれやすいです。
- プロセスの優先度(nice値)
-
優先度の低いプロセスは、システムへの影響が少ないと判断されるため、終了させる優先度が高くなります。
- プロセスの実行時間
-
長時間実行されているプロセスは終了されにくい傾向があります。
- プロセスの親子関係
-
子プロセスが終了される場合、その親プロセスも終了される可能性があります。
oom_killerがトリガーされると、カーネルはメモリ不足の状態を解消するために、上記の基準をもとにプロセスを選択し、強制終了します。
これにより、システム全体がクラッシュするのを防ぎ、重要なプロセスやサービスの継続的な動作を維持することができます。
設定の確認と変更
oom_killerの設定は、以下のファイルに定義されています。
- /proc/sys/vm/oom_kill_allocating_task
- /proc/sys/vm/panic_on_oom
- /proc/sys/vm/oom_dump_tasks
/proc/sys/vm/oom_kill_allocating_task
この設定は、メモリ不足の際にメモリを割り当てようとしたプロセスを終了するかどうかを決定します。
echo 1 > /proc/sys/vm/oom_kill_allocating_task # メモリを割り当てようとしたプロセスを終了
echo 0 > /proc/sys/vm/oom_kill_allocating_task # 通常のoom_killerアルゴリズムを使用
/proc/sys/vm/panic_on_oom
メモリ不足時にカーネルパニックを起こすかどうかを決定します。
echo 1 > /proc/sys/vm/panic_on_oom # メモリ不足時にカーネルパニック
echo 0 > /proc/sys/vm/panic_on_oom # 通常のoom_killer動作
カーネルパニックとは、オペレーティングシステムのカーネルが重大なエラーを検出し、その後の動作を継続できないと判断した場合に発生するエラー状態です。
この状態になると、カーネルはシステムを停止し、エラー情報を表示して、データの損失や破損を防ぐためにシステムを再起動することがあります。
/proc/sys/vm/oom_dump_tasks
メモリ不足時にoom_killerが実行中のタスクの情報をダンプするかどうかを決定します。
echo 1 > /proc/sys/vm/oom_dump_tasks # タスク情報をダンプ
echo 0 > /proc/sys/vm/oom_dump_tasks # タスク情報をダンプしない
永続的な変更
上記の設定は再起動するとリセットされるため、永続的に変更するには、/etc/sysctl.confファイルに追加します。例えば、以下のように設定します。
vm.oom_kill_allocating_task = 1
vm.panic_on_oom = 0
vm.oom_dump_tasks = 1
その後、次のコマンドを実行して設定を適用します。
sysctl -p