已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
8C32G 节点(K8s 1.28.9,cgroup v2,containerd),跑一个 Java 17 / Spring Boot 3 的无状态订单服务。Pod spec:memory.request=2Gi / limit=4Gi(Burstable,成本原因没做全量 Guaranteed)。监控栈:cAdvisor(kubelet 内置)→ Prometheus → Grafana,指标基本就是 container_memory_working_set_bytes、container_memory_usage_bytes、container_memory_rss、container_memory_cache。
上周压测(QPS 约为日常 2.5 倍)时容器被 cgroup OOMKilled,dmesg 确认是 cgroup OOM 而非 JVM 自身 OOM。事后复盘:JVM 堆峰值 -Xmx=2.5g 只用到 ~1.9g,真正撞穿 limit 的是 DirectByteBuffer + 线程栈 + glibc arena 的堆外部分(与《容器 OOMKilled 但 Java 堆没满》那篇复盘的形态一致)。问题不是"事后怎么查",而是事前我们一条告警都没响——从 RSS 开始爬升到被 kill,我们事后看曲线只有约 3 分钟的窗口,而告警当时是静音的,因为根本没配过这条规则。
memory.pressure 能拿到 some/full 的 avg10/avg60/avg300,但团队里没人用过,不知道该看 some 还是 full、avg10 还是 avg300、阈值给多少,也没有现成的告警规则模板。jvm_buffer_pool_used_bytes(Direct)+ jvm_threads_live_threads 做组合预测:可行但需要把 JVM 指标和 cgroup 指标做关联,工程量大,想先看看有没有更省事的通用做法。说明:本站已有 JVM 堆配置(id=59、id=907)、堆外排查(id=166)、limit 策略之争(id=432)等帖,本问聚焦事前预警的指标选择与阈值校准,不重复讨论"怎么配堆"。