已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 我在一个 K8s 1.28 集群(14 节点,16C64G,cgroup v2,containerd 1.7)里跑一套 Java 17 无状态订单服务。Pod 里有两个容器:
-Xmx3.5g -XX:+UseG1GC社区里「Java 堆没满但 OOMKilled」的文章和提问已经很多(比如 id=166 那篇堆外内存预算复盘讲得很细),但我们的问题不在 Java 进程自身——主容器 heap 峰值 3.2G / 3.5G、GC 干净、没有 Full GC,我怀疑内存是被 sidecar 吃掉的,但 sidecar 的 RSS 在主容器的监控体系里完全不可见。
【现象】 过去两周,该 Pod 每天被 OOMKilled 1~2 次(dmesg 显示 cgroup OOM,不是 JVM 自己抛 OOM)。但:
/stats/prometheus 看不到异常:heap_allocated 稳定在 180~220M,downstream_cx_active 正常;【已尝试的排查与结果】
-Xmx 从 3.5g 降到 3.0g,无效,照样 OOMKilled——说明问题不在 Java 堆;heap_allocated、heap_used 都在正常范围,看不到内存膨胀;per_connection_buffer_limit_bytes=1MiB,连接一多就放大),但抓不到现场;cat /sys/fs/cgroup/.../memory.current 看 sidecar 容器的实际 RSS,但不知道 cgroup v2 下 sidecar 容器的 cgroup 路径怎么找、怎么和 Pod cgroup 区分。【期望得到的答案形态】
memory.current、memory.stat 在容器内的 cgroup 路径怎么找?有没有比"进容器 cat"更好的办法?Prometheus / cAdvisor 能不能按容器粒度抓?)resourceLimits、还是必须拆成两个 Pod?)【相关阅读】