テック技報最新号へ →
インフラ

Kubernetes の「メモリ使用量」は一つではない: OOMKilled と Eviction の見分け方

kubectl top が見ている working set と、memcg OOM(memory.current vs limit)と、kubelet の eviction(ノードの memory.available)は別物。だから「top では余裕があるのに OOMKilled」「MemAvailable ベースでは空いているのに Evicted」が起こる。

@yosshi_ · 投稿 2026-10-09
#infra#kubernetes#memory#oom#eviction#observability

どんなときに使う?

  • コンテナが OOMKilled されたが limit まで余裕があるように見える
  • ノード使用率が低そうなのに Pod が Evicted される
  • request の見直しで global OOM / eviction を減らしたい

覚え方(イベントと見ている値)

イベント見ている値条件のイメージ
memcg OOMコンテナ/Pod/kubepods の memory.currentmemory.max(limit)に達し、reclaim しても下がらない
global OOMノード全体のメモリ枯渇oom_score で犠牲プロセスを選ぶ(request / QoS が効く)
Evictionノードの memory.available ≒ MemTotal − ルート cgroup の working setkubelet の evictionHard / Soft(既定は memory.available<100Mi など)
  • kubectl top / container_memory_working_set_bytes は working set(おおむね memory.current − inactive_file)。RSS ではない
  • memcg OOM は working set ではなく memory.current を limit と比較する
  • Node に SystemOOM イベントがあれば global OOM の証拠。無いからといって memcg とは限らない(イベント保持は既定約 1 時間)

対処の優先順位

  1. 実際の使用量に合わせて memory request を合わせる — 配置密度・eviction 候補・oom_score_adj に効く(global OOM / eviction 向け)。memcg OOM には効かない
  2. memcg OOM なら limit の見直しと、Pod / kubepods.slice 側で当たっていないかも確認
  3. 調査の入口: kubectl describe pod の OOMKilled → ノードの SystemOOM → container_memory_usage_bytes と working set / RSS の比較

詳細な cgroup v2 対応表・PromQL・VPA の話は出典記事にまとまっている。

出典

X の元の投稿を開く