← 每日面试题 学习看板

服务发布分10批,第一批发完后负载很高后面恢复正常,如何处理?

面试题/01实践场景题/问题排查/服务发布分10批,第一批发完后负载很高后面恢复正常,如何处理?.md

面试记录 2026-10-22

题目:服务发布分 10 批,第一批发完后负载很高后面恢复正常,如何处理?

难度:medium

标签:practice/debug, architecture/deployment, jvm/jit, difficulty/medium

评分:⭐⭐⭐☆☆(3/5)

我的回答

服务发布一般来说应该是先灰度,服务部署分配少量流量,服务没问题了,再考虑部署其他服务,而且第一批部署了之后,如果出现负载很高,需要先暂停后续发布,观测负载情况,对负载升高检查,检查本次发版内容,是否有特殊的改动,发布后负载高了,需要检查是否引入了什么内容,检查监控看服务的接口调用量是否有激增,是否出现某些服务调用异常,是否存在某些加载异常,但是后续平稳了,意味着是部署开始时有问题,时间拉长或者说,服务部署多了均衡后服务稳定了,需要观察负载对比同期是否有什么变化,是否发生增高,如果有,检查新增或者改动的功能是否有什么问题,进行分析,是什么情况

点评

优点:处置动作是对的——发现异常先暂停后续批次、保留现场、对比同期,不盲目全量推进;也提到了灰度与流量分配的意识,这是线上发布的正确姿势。

不足:① 没有解释为什么只有第一批高。这题的核心是"冷启动效应",不是发布流程问题;② 没区分别的候选原因:第一批节点少导致单机承担比例失衡、新节点未预热(JIT 还在解释执行)、本地缓存为空、连接池未建立、类加载与元空间首次分配、健康检查失败导致流量全压在少数节点;③ 没给出可落地的修复:预热接口、流量慢启动、批次比例递增、就绪探针加延迟、发布后对比压测。

补充:典型的冷启动曲线是——新实例刚上线时 CPU 高、P99 长尾明显,跑几百到几千次请求后 JIT 完成 C1/C2 分层编译、缓存和连接池热起来,指标自然回落。所以"后面批次正常"恰恰说明不是代码 bug,而是新实例还没热。若第一批也占比很小却仍然高,要怀疑流量没按预期均摊(权重、会话保持、LB 慢启动缺失)。

完整讲解

第一部分:知识重点剖析

核心考点定位:考察能否把"发布期负载异常"归因到冷启动 + 流量分配这两个机制上,并给出工程化对策。

知识点拆解:

  1. JIT 冷启动:新 JVM 先解释执行,热点方法达到阈值才触发 C1/C2 编译。发布初期 CPU 里既有业务计算又有编译线程开销,方法执行还慢,表现为 CPU 高、P99 长尾,跑一段时间后自然消失。
  2. 缓存与连接池冷:本地缓存(Caffeine/Guava)为空,请求全部穿透到 Redis/DB;数据库连接池、HTTP 连接池尚未建立,需要反复握手;线程池也在扩容。这些都会让首批实例的单位请求成本显著更高。
  3. 流量分配不均:滚动发布时旧实例被摘除,新实例数量少却承接同等流量;若 LB/K8s 没有慢启动(slow start)策略,新实例一上线就吃满权重,单机压力被放大。会话保持、长连接不断开也会让流量堆积在少数节点。
  4. 健康检查与就绪探针:就绪探针通过过早,流量在应用真正可用前就打进来;探针配置不合理(超时太短)会导致实例被反复摘除重建,进一步加剧抖动。
  5. 其他可能:新版本引入了更重的初始化(大对象、全量加载配置)、依赖的下游在发布期被瞬时放大、日志级别被误调成 DEBUG、第一批恰好落在资源紧张的宿主机。
按「底层原理 → 设计权衡 → 工程实践」递进排列。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 怎么判断是冷启动而不是新版本有 bug?
  1. JVM 层面怎么预热?
  1. K8s 下怎么避免新 Pod 一上线就被打满?

第三部分:面试者参考回答(三步法口语化,300-400 字)

【一句话结论】

面试官您好,只有第一批高、后面正常,最典型的原因是新实例冷启动,不是代码有问题,处置上先暂停后续批次保现场。

【三点展开】

第一,先解释现象。新 JVM 刚起来时方法还在解释执行,热点没到阈值没触发 C1/C2 编译;本地缓存是空的,请求全打到 Redis 和数据库;连接池、线程池也没建好。所以同样流量下,首批实例的 CPU 和 P99 明显更高。跑一段、请求量上去之后自然回落,这就是后面批次正常的原因。

第二,排除其他可能。第一批节点少,如果 LB 没有慢启动,流量会按权重压到少数新节点;就绪探针配置不当会让流量在应用真正可用前打进来;会话保持和长连接也会让流量堆积。要按实例看 QPS 和延迟分布,确认是"每台都高"还是"少数几台高"。

第三,处置。当下先暂停后续批次,观察是否在 10-30 分钟内收敛;确认是新版本问题时立即回滚。长期做三件事:发布前预热核心接口和缓存、LB 开慢启动并让批次比例递增、探针加初始延迟和 minReadySeconds,发布后拿同口径的压测数据做对比。

【一句边界】

当然,如果后续批次也高,或者指标不随时间回落,那就不是冷启动,要按新版本引入的性能问题去查,比如日志级别、序列化方式、新增的同步调用。