已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
memory.request=2Gi / memory.limit=2Gi(request=limit 避免 QoS 降级)。container_memory_working_set_bytes 没越过 limit、oom_kill 计数也没涨——内核 reclaim 在 cgroup 内发生了,但应用侧看不到任何告警。node_memory_MemAvailable 跌到 <10% 时,Go Pod 的 P99 从 45ms 抖到 2–8s,持续 10–60s。cat /sys/fs/cgroup/.../memory.stat 里 pgscan_kmem / pgsteal 有明显增量,说明 reclaim 打到了我们这个 cgroup。GODEBUG=gctrace=1 显示 GC pause 正常(<20ms),说明抖动不是 Go GC 引起的,而是内核在 cgroup 内做 page reclaim / direct reclaim 阻塞了业务线程(malloc 或 mmap 路径)。memory.events 里 high 计数没涨(因为我们没设 memory.high),max 计数也没涨(没 OOM)。memory.high 通过 daemonset 直接写 cgroup(K8s 本身不暴露 memory.high),设成 1.9Gi(max=2Gi,差 100Mi),观察 3 天:P99 尖刺从 2–8s 降到 200–500ms,但 memory.events 的 high 计数开始增长,说明内核在 high 水位就开始主动 reclaim 而不是等到节点级压力再打过来。memory.low(cgroup v2 的"尽力保护"),发现它只防节点级 reclaim 打进来,对 cgroup 内自身压力无效,和 memory.high 是两个不同的旋钮。memory.events 的 high 计数 + memory.stat 的 pgscan/pgsteal 数据。memory.peak 配合 memory.high 的组合)这个问题和 id=1441 是互补的:1441 问的是 Go runtime 侧的软限比例,本问是内核侧 cgroup v2 的软限比例,两者叠加才是完整的内存预算策略。