cgroupのメモリ制限とは? containerのメモリ上限の解説
cgroupのメモリ制限は、containerごとのメモリの上限だ。それに達すると、たとえホストにギガバイトの空きがあっても、カーネルはそのグループ内でOOM-killする。
control groups(cgroups)は、プロセスのグループが使えるCPU、メモリ、I/Oの量を制限するLinuxの機能だ。メモリ制限は、基盤のマシンがアイドルに見えるのにcontainer化されたCIのjobがメモリ不足になりうる理由だ。
cgroupとは
cgroupは、リソース制限が付与された、カーネル管理のプロセスのバケツだ。containerや多くのCIのjobはその中で動く。メモリコントローラは、グループの使用量にハードな上限を設定し、ホストの総RAMとは独立してそれを強制する。
ホストのメモリに空きがあってもjobがOOMになる理由
cgroupの使用量がその制限に達すると、カーネルは*そのcgroupにスコープされた*OOM killをトリガーする - ホストを確認する代わりに、グループ内のプロセスをkillする。だから16 GBのマシンでも、2 GBに制限されたjobをOOM-killしうる。ホストレベルのfreeの出力は、cgroupで制限されたjobには無関係だ。
検査と調整の方法
- job内でcgroupから制限を読む(例: cgroup v2の
memory.max)。 - プロセスのピークRSSを、ホストのRAMではなくその制限と比較する。
- container/jobのメモリ制限を上げるか、その下に収まるようピーク使用量を下げる。
cgroup v2 memory ceiling
cat /sys/fs/cgroup/memory.maxチューニングにとって重要な理由
heapをホストのRAMに合わせて自動サイズ化する言語ランタイム(古いJVM、一部のNodeのデフォルト)は、cgroupの制限をはるかに超えてオーバーコミットしkillされうる。ランタイムをcgroup-awareにするか、明示的なheap上限を設定して、ホストではなくcontainerに合わせてサイズ化させる。
重要なポイント
- cgroupのメモリ制限は、ホストのRAMとは独立してcontainer/jobを制限する。
- それに達すると、そのcgroupにスコープされたOOM killが発生する → exit 137。
- ホストのメモリの空きは、cgroupで制限されたjobを守らない。
- ランタイムをcgroup-awareにするか、制限に収まるよう明示的なheap上限を設定する。
関連ガイド
What Does "OOM Killer" Mean? The Linux Out-of-Memory KillerThe OOM killer is the Linux mechanism that kills a process when the system runs out of memory. Learn how it p…
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 CI Runner? Managed vs Self-Hosted ExplainedA CI runner is the machine that executes your pipeline jobs. Learn how runners work, the difference between h…