已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
背景
K8s 1.28.9,Java 17 / Spring Boot 3,JVM 堆 8G,冷启动约 35s。4 副本,maxSurge=1 / maxUnavailable=0,走 kubectl apply 滚动发布。核心接口 P99 SLO < 50ms,日常 P99 约 25ms。
现象 每次滚动发布,新 Pod 被 readiness 标记 Ready 后,前 60~90s 核心接口 P99 稳定抖到 90~150ms;P50 基本不受影响(30ms→45ms);CPU 在这段窗口里反而偏高(25%→45%);GC 日志无异常(YGC 频率正常、无 FGC)。随后自行回落到基线。
已尝试的排查与结果
-XX:+AlwaysPreTouch:P99 从 150ms 降到 110ms,缓解了一部分但没根治(参考 @林亦舟-861 的复盘,page fault 确实是主因之一,但还有 JIT 和连接池冷启动的叠加)。/ready 接口,内部检查 JIT 已编译热点方法数(通过 -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation 抓 .log 解析):能识别"JIT 还没热",但 readiness 本身是 0/1 二值,没法表达"JIT 已热 60%"这种中间态。warmup label,只放 10% 流量,60s 后全量:能用,但有几个坑(见下)。当前方案的三个坑
期望得到的答案形态
warmed gate 在 60s 后才通过,期间流量权重低)——有没有人真正落地过?annotation 怎么配?initialConnectionPoolSize + warmupDurationSec),它和 K8s readiness 的时序关系是怎样的?warm-up 期间 Envoy 的权重是 0 还是低?相关参考