OOM killer
概念すべての Linux ディストリビューション
OOM (out-of-memory) killerは、システムメモリが枯渇し、解放も不可能な場合にプロセスを終了させるLinuxカーネルの機能です。通常、メモリ使用量が最も多いプロセスがOOMスコアに基づいて選択されます。OOMによる終了はすべてカーネルログに記録されます。
1終了対象の選定基準
各プロセスには /proc/<pid>/oom_score にスコアが割り当てられており、メモリ使用量に応じて増加します。/proc/<pid>/oom_score_adj を使用して -1000 から 1000 の範囲で調整が可能で、-1000 に設定するとそのプロセスは終了対象から除外されます。
2OOMによる終了の確認方法
カーネルはログに「Out of memory: Killed process」と書き込みます。journalctl -k | grep -i oom または dmesg | grep -i oom を実行することで、プロセス名やメモリ使用量を含むこれらのメッセージを確認できます。
3予防策
メモリやスワップの追加、メモリ消費の激しいサービスの制限、あるいは systemd の MemoryMax= などのオプションを使用してサービスごとに制限を設定します。一部のディストリビューションでは、メモリ負荷に基づいて早期に対処する systemd-oomd が実行されています。
OOMによる終了の調査手順
- カーネルログを検索する:
journalctl -k | grep -i -A5 'out of memory' - 終了させられたプロセスとそのメモリサイズを確認する。
- 現在のメモリとスワップの使用状況を確認する:
free -h - メモリ使用量の大きいプロセスを特定する:
ps aux --sort=-rss | head - スワップの追加やサービスの制限を行い、再発するかどうかを監視する。
注意点
- 多数のプロセスに対して oom_score_adj を -1000 に設定すると、カーネルが安全に終了できるプロセスを見つけられなくなる可能性があります。
- メモリオーバーコミット保護を理解せずに無効化すると、他の箇所で障害が発生する原因となります。
関連記事
- LinuxのSwap領域Swapとは何か、freeコマンドやswaponコマンドでの確認方法、Swapファイルの追加方法、vm.swappinessの設定変更について解説します。
- ロードアベレージ3つのロードアベレージの数値が意味するもの、CPUコア数との関係、および高負荷が問題となるタイミングについて解説します。
- journalctl と systemd ジャーナルjournalctl を使用したログの読み取り方法、ジャーナルが使用している容量の確認方法、および --vacuum オプションを使用して安全に縮小する方法について解説します。
出典
- proc(5) マニュアルページ: oom_score および oom_score_adj man7.org
- Out Of Memory Management (kernel.org) kernel.org
補足: RainServerはLinuxサーバー向けの監視および安全なクリーンアップ機能を提供しており、変更内容を事前に表示して確認を求めます。
最終確認: