Skip to content
Latchkey

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上限を設定する。

関連ガイド