「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の制限に注意。
関連ガイド
Exit Code 137 Explained: SIGKILL and the OOM Killer in CIWhat exit code 137 means in CI: the process received SIGKILL, almost always from the out-of-memory killer. Ho…
What Is a cgroup Memory Limit? Container Memory Caps ExplainedA cgroup memory limit caps how much memory a container or job can use, independent of the host. Learn why a j…
SIGKILL vs SIGTERM: The Two Ways a Process DiesSIGTERM politely asks a process to stop and can be handled; SIGKILL forces it to die and cannot be caught. Le…