0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux の OOM Killer を学ぶ ~概要編~

0
Last updated at Posted at 2026-05-04

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 カーネルに組み込まれている メモリ保護機構

メモリが枯渇すると:

  1. ページキャッシュを削る

  2. スワップを使う

  3. それでも足りない

  4. 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 スコアの調整

これらを理解しておくと、
本番環境でのトラブルシュートが圧倒的に楽になります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?