OOM Killerに殺された犯人と原因調査
夜間にアプリが突然消えていた。エラーログには何も無い。OOM Killer(メモリ枯渇時の強制終了)の仕業かを確かめ、再発を防ぎたい。
手順
journalctl -k --since yesterday | grep -i 'out of memory'カーネルログからOOM Killerの発動記録を探す。「Out of memory: Killed process」の行が見つかれば確定。dmesg -T | grep -i -A 20 'out of memory'発動時のメモリ状況の詳細(各プロセスのメモリ使用一覧表)を読む。-Tで人間が読める時刻表示になる。殺されたプロセスと、実際に食い潰していたプロセスは別のことがある。sar -rsysstatが有効なら、時間帯ごとのメモリ使用率の推移を見る。じわじわ増えていればメモリリーク、突発ならバッチ処理などのスパイクが疑わしい。cat /proc/1234/oom_score稼働中プロセスの「殺されやすさスコア」を確認する。メモリを多く使うほど高くなり、OOM時に選ばれやすい。sudo systemctl edit myapp.service恒久対策その1。ユニットに MemoryMax=2G を設定し、暴走してもそのサービス内で止まるよう上限を切る。道連れOOMを防げる。echo -1000 | sudo tee /proc/5678/oom_score_adj恒久対策その2。絶対に殺されては困むプロセス(例: DB)のoom_score_adjを下げて保護する。-1000で対象外になるが、乱用すると別の重要プロセスが犠牲になる。⚠
注意「殺されたプロセス=犯人」とは限らない。真犯人が食い潰した結果、スコアの高い別プロセスが処刑されることがある。dmesgのメモリ一覧で本当の大食いを特定してから対策すること。