发布后前 3 分钟 QPS 只有 2600,稳态是 9000,P99 从 90 毫秒涨到 700 毫秒。3 分钟后自行恢复,日志里没有任何报错。乍看像缓存或者权限的锅,追下去往往不是。
java -XX:+TieredCompilation -XX:TieredStopAtLevel=4 -jar app.jar for i in $(seq 1 1000); do curl -s localhost:8080/api/order/1 >/dev/null; done
追下去是这么回事:JVM 启动时方法走解释执行,热点代码要跑够次数才编译。压测通常跑在已经预热过的实例上,冷启动的能力从来没测过。容器刚起来就接全量流量,第一批请求全压在慢路径上。
碰到「JIT 预热」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,压测分冷启动和稳态两段 分别记录;打开分层编译并预热核心接口 1000 次;发布时先放少量流量 观察 2 分钟再全量;配合就绪探针延迟 别让新实例立刻接满。
验收就看一点,冷启动 1 分钟后 QPS 达到稳态的 80%,P99 与稳态差值在 30 毫秒内。
