题目:服务发布分 10 批,第一批发完后负载很高后面恢复正常,如何处理?
难度:medium
标签:practice/debug, architecture/deployment, jvm/jit, difficulty/medium
评分:⭐⭐⭐☆☆(3/5)
服务发布一般来说应该是先灰度,服务部署分配少量流量,服务没问题了,再考虑部署其他服务,而且第一批部署了之后,如果出现负载很高,需要先暂停后续发布,观测负载情况,对负载升高检查,检查本次发版内容,是否有特殊的改动,发布后负载高了,需要检查是否引入了什么内容,检查监控看服务的接口调用量是否有激增,是否出现某些服务调用异常,是否存在某些加载异常,但是后续平稳了,意味着是部署开始时有问题,时间拉长或者说,服务部署多了均衡后服务稳定了,需要观察负载对比同期是否有什么变化,是否发生增高,如果有,检查新增或者改动的功能是否有什么问题,进行分析,是什么情况
优点:处置动作是对的——发现异常先暂停后续批次、保留现场、对比同期,不盲目全量推进;也提到了灰度与流量分配的意识,这是线上发布的正确姿势。
不足:① 没有解释为什么只有第一批高。这题的核心是"冷启动效应",不是发布流程问题;② 没区分别的候选原因:第一批节点少导致单机承担比例失衡、新节点未预热(JIT 还在解释执行)、本地缓存为空、连接池未建立、类加载与元空间首次分配、健康检查失败导致流量全压在少数节点;③ 没给出可落地的修复:预热接口、流量慢启动、批次比例递增、就绪探针加延迟、发布后对比压测。
补充:典型的冷启动曲线是——新实例刚上线时 CPU 高、P99 长尾明显,跑几百到几千次请求后 JIT 完成 C1/C2 分层编译、缓存和连接池热起来,指标自然回落。所以"后面批次正常"恰恰说明不是代码 bug,而是新实例还没热。若第一批也占比很小却仍然高,要怀疑流量没按预期均摊(权重、会话保持、LB 慢启动缺失)。
核心考点定位:考察能否把"发布期负载异常"归因到冷启动 + 流量分配这两个机制上,并给出工程化对策。
知识点拆解:
按「底层原理 → 设计权衡 → 工程实践」递进排列。
考察方向:
延伸递进面试题:
minReadySeconds,并用 PreStop + 优雅停机保证摘流顺序。【一句话结论】
面试官您好,只有第一批高、后面正常,最典型的原因是新实例冷启动,不是代码有问题,处置上先暂停后续批次保现场。
【三点展开】
第一,先解释现象。新 JVM 刚起来时方法还在解释执行,热点没到阈值没触发 C1/C2 编译;本地缓存是空的,请求全打到 Redis 和数据库;连接池、线程池也没建好。所以同样流量下,首批实例的 CPU 和 P99 明显更高。跑一段、请求量上去之后自然回落,这就是后面批次正常的原因。
第二,排除其他可能。第一批节点少,如果 LB 没有慢启动,流量会按权重压到少数新节点;就绪探针配置不当会让流量在应用真正可用前打进来;会话保持和长连接也会让流量堆积。要按实例看 QPS 和延迟分布,确认是"每台都高"还是"少数几台高"。
第三,处置。当下先暂停后续批次,观察是否在 10-30 分钟内收敛;确认是新版本问题时立即回滚。长期做三件事:发布前预热核心接口和缓存、LB 开慢启动并让批次比例递增、探针加初始延迟和 minReadySeconds,发布后拿同口径的压测数据做对比。
【一句边界】
当然,如果后续批次也高,或者指标不随时间回落,那就不是冷启动,要按新版本引入的性能问题去查,比如日志级别、序列化方式、新增的同步调用。