Linux のメモリトラブルを調査していると、
「Out of memory: Killed process xxxx」
というログに遭遇することがあります。
これは OOM Killer(Out-Of-Memory Killer) が発動し、
メモリを食い尽くしたプロセスを強制終了したことを意味します。
本記事では以下をまとめます:
-
OOM Killer が発動する仕組み
-
どのプロセスが kill されるかの判断基準
-
OOM Killer のログの読み方
-
OOM の制御方法(無効化はできる?)
-
Docker / systemd での OOM 制御
🟥 OOM Killer とは?
Linux カーネルに組み込まれている メモリ保護機構。
メモリが枯渇すると:
-
ページキャッシュを削る
-
スワップを使う
-
それでも足りない
-
OOM Killer 発動 → プロセスを kill
OS 全体がフリーズするのを防ぐための「最後の砦」です。
🟧 OOM Killer がプロセスを選ぶ基準(OOM スコア)
Linux はプロセスごとに** OOM スコア(0〜1000)** を持っています。
スコアが高いほど killされやすい。
スコアが上がる条件:
-
メモリ使用量が多い
-
親プロセスが軽い
-
システムにとって重要度が低い
-
nice 値が高い
-
cgroup の制限を超えている(Docker など)
逆に、スコアが低いほど killされにくい。
🟨 OOM Killer のログの読み方(実例)
以下は Python のメモリリークで実際に出たログ:
python3 invoked oom-killer: gfp_mask=0x140cca(GFP_HIGHUSER_MOVABLE|__GFP_COMP), order=0, oom_score_adj=0
oom-kill:constraint=CONSTRAINT_NONE,task=python3,pid=1165,uid=0
Out of memory: Killed process 1165 (python3) total-vm:9422656kB, anon-rss:7434112kB
✓1行目:メモリ確保に失敗
python3 invoked oom-killer
⇒python3がメモリを要求したが、空きがなくOOM Killerが発動。
✓2行目:どのプロセスが対象か
task=python3,pid=1165
✓3行目:killされたプロセスのメモリ量
total-vm:9422656kB → 仮想メモリ 9GB
anon-rss:7434112kB → 実メモリ 7.4GB
🟩OOM Killer は無効化できる?
結論:
OOM Killer は完全には無効化できない(してはいけない)
理由:
-
無効化すると OS 全体がフリーズする
-
SSH も反応しなくなる
-
再起動しかできなくなる
Linux は OOM Killer を OS の安全装置として必ず動作させます。
🟦 ただし「挙動を制御する」ことはできる
✔ 特定プロセスを殺されにくくする(重要プロセス保護)
echo -1000 > /proc/<PID>/oom_score_adj
- -1000 ⇒絶対にkillされない
- 0 ⇒ 通常
- 1000 ⇒最もkillsされやすい
特定プロセスを殺されやすくする(暴走プロセス対策)
echo 1000 > /proc/<PID>/oom_score_adj
メモリリークしやすいアプリを優先的に kill させたいときに有効。
🟪 Docker での OOM 制御
Docker は cgroup を使っているため、
コンテナ単位で OOM の挙動を制御できます。
✔ メモリ制限を設定
docker run --memory=512m --memory-swap=512m ...
✔ OOM Killer をコンテナ内で無効化(ホストは守られる)
docker run --oom-kill-disable ...
ただし:
-
コンテナは固まる
-
ホストは生き残る
という挙動になります。
🟫 systemd での OOM 制御(RHEL 本番でよく使う)
systemd サービス単位で OOM スコアを調整できます。
[Service]
OOMScoreAdjust=-1000
サービスを OOM から守りたいときに使う。
🧠 まとめ
| できること | 内容 |
|---|---|
| ❌ OOM Killer の完全無効化 | 不可(OS が死ぬため) |
| ⭕ プロセスごとに kill されにくくする | oom_score_adj=-1000 |
| ⭕ プロセスごとに kill されやすくする | oom_score_adj=1000 |
| ⭕ Docker コンテナ単位で制御 | --oom-kill-disable |
| ⭕ systemd サービス単位で制御 | OOMScoreAdjust= |
📝 おわりに
OOM Killer は「怖いログ」ではなく、
OS を守るために働いてくれる頼れる存在です。
-
メモリリークの調査
-
Docker のメモリ制限
-
systemd の OOM 制御
-
OOM スコアの調整
これらを理解しておくと、
本番環境でのトラブルシュートが圧倒的に楽になります。