はじめに
OOM Killer(Out-of-Memory Killer)は、システムのメモリが不足したときに介入するLinuxの重要な仕組みです。プロセスを終了してメモリを解放し、システムを稼働し続けます。メモリ不足の状況では命綱となりますが、その動作はときに恣意的でわかりにくいものに思えることがあります。
OOM Killerの背後にある概念を理解しやすくするために、飛行機、乗客、燃料不足が登場する楽しい例えを紹介します。
OOM Killerとは
OOM Killerは、システムのメモリが不足し、リソースを回収する必要が生じたときに発動します。メモリ使用量、優先度、システムにとっての重要度などの要因に基づいて、どのプロセスを終了するかを決めるスコアリングシステムを使用します。
イラスト:飛行機の例えでOOM Killerを理解する
ある航空会社が、燃料を少なめに積んで飛行するほうが安上がりだと気づいたと想像してください。コストは節約できますが、飛行中に燃料不足になることが時々あります。墜落を防ぐため、エンジニアたちはOOF (Out-of-Fuel)、乗客を機外に放り出して重量を減らし、飛行時間を延ばす仕組みを開発しました。
緊急時には、乗客が1人選ばれて機外に投げ出されます。ここにジレンマがあります:
- 誰を放り出すべきか?ランダムにすべきか、それとも体重の重い乗客を優先すべきか?
- 乗客は放り出されないために追加料金を払うべきか?
- パイロットが選ばれたらどうなるか?
やがてエンジニアたちはシステムを改良しますが、それでも時々誤作動し、燃料不足がないときでも乗客を放り出してしまいます。このユーモラスな例えは、OOM Killerの課題を映し出しています。OOM Killerも、システムのメモリが深刻に不足していないときでも、予期せずプロセスを終了することがあります。
LinuxにおけるOOM Killerの仕組み
OOM Killerは、どのプロセスを終了するかを決めるためにスコアリングシステムを使用します。判断材料には次のようなものがあります:
- メモリ使用量:最も多くのメモリを消費しているプロセスが対象になりやすいです。
- 優先度:優先度の低いプロセスはkillされる可能性が高くなります。
- 重要度:システムにとって重要なプロセス(カーネルなど)は通常は見逃されます。
OOM Killerが発動すると、メモリを解放してシステムの安定性を回復するためにプロセスを終了します。
OOM Killerの管理
クラウド環境やオンプレミスのインフラでLinuxを運用している場合、OOM Killerを理解し管理することは不可欠です。いくつかのヒントを紹介します:
1. OOMスコアを調整する
プロセスのoom_score_adj値を調整することで、OOM Killerの動作に影響を与えることができます。スコアが低いほど、プロセスがkillされる可能性は低くなります。
コマンド例:
echo -1000 > /proc/<pid>/oom_score_adj
2. メモリ使用量を監視する
OOM Killerが介入する前にメモリ使用量を監視し、リソースを大量に消費するプロセスを特定するには、htop、free、またはvmstatなどのツールを使用してください。
3. スワップ領域を割り当てる
スワップ領域を追加すると、追加の仮想メモリが提供され、OOM状態が発生する可能性を減らすことができます。
スワップファイルを作成するコマンド例:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
4. ドキュメントとログを活用する
システムログ(/var/log/syslogまたはdmesg)を確認して、OOM Killerが発動した理由と、影響を受けたプロセスを把握してください。
参考資料
OOM KillerとLinuxのメモリ管理について詳しくは、次をご覧ください: