Skip to content
Latchkey

「OOM killer」とは? Linuxのout-of-memory killer

Linuxが利用可能なメモリを使い果たすと、カーネルのOOM killerがプロセスを選び、システムを生かすためにSIGKILLで終了させる。CIでは、そのプロセスは通常あなたのbuildだ。

out-of-memory(OOM)killerは、カーネルの最後の手段の安全弁だ。割り当てるメモリが残っていないとき、システム全体をフリーズさせる代わりにプロセスを犠牲にする - そして選ばれたプロセスは即座に死ぬ。

なぜ存在するか

Linuxはプロセスに楽観的にメモリを割り当てさせ、すべてが一度に使われるわけではないと仮定する。その仮定が崩れ、物理メモリとswapが枯渇すると、カーネルは以降の割り当てを満たせない。クラッシュする代わりに、OOM killerを呼び出して何かをkillしメモリを解放する。

どう犠牲者を選ぶか

カーネルは各プロセスを、使用メモリ量に大きく重みづけした「oom_score」で採点する。最大のメモリ消費者が最も犠牲になりやすい。CIではそれは通常、重い処理を行うコンパイラ、test runner、または言語のVM - まさにあなたが大事にしていたプロセスだ。

CIでどう現れるか

  • stepがKilledという語とともに突然死に、stack traceがない。
  • exit codeは137(128 + 9、SIGKILL)だ。
  • カーネルログにOut of memory: Killed process / oom-killの行が表示される。

CIでのOOMの修正

jobにより多くのメモリを与える(より大きなrunner)か、ピーク使用量を減らす - テスト/buildの並列度を下げる、言語のheapサイズに上限を付ける、作業を分割する。containerのrunnerでは、制限はホストの総RAMではなくcgroupのメモリ上限であることが多いため、ホストにメモリの空きがあっても、あなたのjobにあったとは限らない。

重要なポイント

  • OOM killerは、システムがメモリ不足のときプロセスをSIGKILLしてメモリを解放する。
  • 最大のメモリ消費者 - 通常はあなたのbuildまたはテストのプロセス - を狙う。
  • Killedとtracebackなしのexit 137として現れる。
  • メモリを追加するかピーク使用量を下げて修正する; cgroupの制限に注意。

関連ガイド