已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景
我维护一批 RK3588(4C A76 / 4GB)的边缘网关节点,跑 K3s v1.31 + containerd 1.7.x,内核是 5.10(cgroup v2)。业务侧是一个 Java 17 网关代理容器(request=limit=2500Mi)加一个 log-agent sidecar。最近两次 OOMKill 都是"前一刻 RSS 还在涨、下一刻进程没了",Prometheus 15s 粒度完全抓不到峰值,事后只能翻 dmesg。
现象
memory.current 其实在缓慢爬升,但绝对值离 2500Mi limit 还有 300~500Mi 的"安全垫",没有任何绝对值告警能提前报;/sys/fs/cgroup/.../memory.pressure,文件在,full 10s=... 60s=... 300s=... 有值,但 node-exporter(1.6.x)默认没有暴露子 cgroup 的 PSI,只能拿到节点级的;已尝试的排查与结果
cat memory.pressure 确认文件存在且有增量,说明内核 5.10 的 PSI 编译选项是开着的(CONFIG_PSI=y);psi-collector 之类的 exporter,但没在 K3s 生产环境验证过;--eviction-hard 配合 memory.available<15% 做节点级兜底,但驱逐动作比 OOMKill 晚,救不了容器;期望得到的答案形态
memory.pressure,还是用 node-exporter 的 --collector.textfile 挂 cgroup 路径?有没有人在生产验证过?10s/60s 窗口在"预警 OOMKill"这个场景下哪个更稳?阈值取多少(比如 full 10s > 0.1 还是 60s > 0.05)才能既早于 OOMKill 又不至于 Full GC 期间天天误报?memory.current/limit 斜率?memory.stat 里的 pgfault 速率?)引用依据