← 每日面试题 学习看板

RT飙高问题排查过程

面试题/01实践场景题/问题排查/RT飙高问题排查过程.md

完整讲解(权威版)

最后更新:2026-10-28 · 基于第 1 次作答

L1 · 30 秒速记

结论:RT 飙高先切维再归因——按单接口/单机/全量三个维度切分故障范围,再用链路追踪(单接口)、GC+线程池(单机)、中间件+依赖(全量)三套独立证据链归因;关键判据是「Load 高 CPU 低 = IO/锁等待,不是计算瓶颈」。 关键词:先切维 · 单接口/单机/全量 · 链路追踪 · 线程 Dump · CPU 分解 · FullGC 基线 边界:适用于线上接口 RT 整体或部分飙高的被动排障;发布后首批高且自愈属冷启动,不在此排查链;伴随错误率升高需先看依赖熔断与降级状态。

L2 · 核心讲解

核心考点定位:RT 飙高排查的核心方法论是「先切维再归因」。用实例、接口、时间三个维度把故障范围切成两半,差异维度直接指向根因;再对每个维度用独立证据链归因。难点在于区分「CPU 计算瓶颈」与「IO/锁等待」——二者对策完全相反,是排障题里最常见的方向性错误。

机制链(≥3 环):

  1. 某接口 RT 飙高 → 链路追踪定位 span:慢 SQL 或三方调用,因为单接口异常只影响自身调用链,SkyWalking 可直观看到耗时分布
  2. 单机所有接口 RT 飙高 → GC 异常或线程池/连接池耗尽:因为资源被单机内部争抢,Load 高 CPU 高看 GC 日志,CPU 低看锁等待
  3. 全量接口 RT 飙高 → 中间件或下游依赖故障:因为全局共享 Redis/DB/MQ 被拖垮,叠加超时重试放大流量翻倍
  4. 现象反复但指标正常 → 按时间维度对比基线与 P99:因为平均值被快请求稀释,只有长尾才反映真实恶化

证据锚点:

对比与权衡:

方案正确性吞吐/成本失败模式适用边界
先切维再归因高(维度差异直接指根因)低(先看几个指标即可)切错维度会漏根因所有 RT 异常通用
直接猜答案(先查慢 SQL)低(方向性错误常见)中(可能白查一轮)CPU 高≠SQL 慢,锁等待被误判仅现象单一明确时
一把抓线程 Dump中(能看阻塞与死锁)高(多实例采样成本大)快照无法证明热点必须配合 CPU 分解
只盯平均值低(掩盖长尾)低恶化被快请求稀释不作为判据

常见误区:

  1. 错误:RT 高就查慢 SQL → 正确:先切维(单接口/单机/全量)→ 为什么:全量 RT 高可能是 Redis 故障或依赖超时,单机 RT 高可能是 GC/线程池
  2. 错误:Load 高就是 CPU 计算瓶颈 → 正确:Load 高 CPU 低是 IO/锁等待 → 为什么:等待线程休眠不消耗 CPU
  3. 错误:jstack 单次快照就能定位 CPU 热点 → 正确:快照适合看阻塞与死锁,热点用 async-profiler/JFR 采样 → 为什么:热点方法平均只占几个采样点
  4. 错误:CPU 高就是死循环 → 正确:还要看 GC 线程、JIT 编译、CAS 自旋、正则回溯 → 为什么:%usr 高有多种成因,需先分解再定位
  5. 错误:平均 RT 正常就没事 → 正确:要看 P99/P999 → 为什么:平均值被大量快请求稀释,长尾才是雪崩风险来源

适用边界:本讲解适用于「线上接口 RT 整体或部分飙高」的被动排障;若为发布后首批高且 10-30 分钟自然回落,属冷启动(JIT/缓存/连接池/流量分配),不在此排查链;若伴随错误率升高或丢单,需先看依赖可用性、熔断降级与超时重试配置,而非直接进 GC/线程排查。

延伸追问(≥3)

  1. 单机所有接口 RT 高,jstack 看到大量 BLOCKED,下一步怎么定位?
  1. Load 高但 CPU 只有 30%,是什么原因?怎么区分?
  1. Full GC 频繁,怎么判断是泄漏还是分配太快?
  1. 排查中发现某实例依赖超时设 3s 且重试 3 次,有什么风险?

面试者参考回答

【结论】 RT 飙高排查的关键是先切维再归因:按单接口/单机/全量三个维度切分,再对每个维度用独立证据链归因;关键判据是 Load 高 CPU 低 = IO/锁等待而非计算瓶颈。

【三点】 第一,单接口 RT 高,用链路追踪(SkyWalking)看 span,定位慢 SQL 或三方调用;第二,单机所有接口 RT 高,先看监控是否 GC 异常(jstat -gcutil 看 FGC 次数与 FGCT),再抓 jstack 看线程状态(BLOCKED=锁竞争、RUNNABLE=计算、WAITING=等 IO),辅以 pidstat -w 看上下文切换;第三,全量接口 RT 高,查中间件(Redis 慢查询、DB 慢 SQL、MQ 堆积)与依赖超时,警惕超时重试放大。补充判据:Load 高 CPU 低=IO/锁等待;CPU 高先分 %usr/%sys/%wa。

【边界】 适用于被动排障;发布首批高且自愈属冷启动;伴随错误率升高需先看依赖熔断与降级,而非直接进 GC/线程排查。

面试记录 2026-10-28(第 1 次)

题目:RT飙高问题排查过程

难度:medium

标签:practice/debug · os/cpu · os/load · network/debug

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

我的回答

RT出现标高,先定范围,是某个接口出现标高,还是大批接口出现标高?还是某些机器的接口标高,其他机器接口不高,对应有不同的排查;单个接口标高,去检查调用链路,是否链路上出现问题,某个sql,或者某个三方应用,这种可以很直观的在skywalking等链路追踪工具中查看到;如果是某个机器上的接口都rt标高,那么检查下监控,看是否出现gc异常,有大量级的gc导致这台机器上的接口都出现超时,无法正常访问;如果是大批量接口出现rt飙高,那么检查下是否某个中间件出现问题,或者机器收到工具,有大量链接阻塞其他访问;查看指标可以看cpu使用率,检查数据库是否有慢SQL,检查redis是否出现无法正常使用,redis上是否有慢查询;

点评

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

优点:先定范围再排查的分层思路(单接口/单机/全量)排查方法论正确;区分单接口链路/单机GC/全局中间件三类根因判断准;提到链路追踪工具 SkyWalking。

不足:没提 CPU/GC 的具体判据(Full GC 频率/STW 时长/GC 日志);没提线程 Dump 分析(jstack 看 BLOCKED/死锁/池耗尽);没提 Load 与 RT 的关联(Load 高但 CPU 不高→IO 等待/锁等待而非计算瓶颈);没提连接池耗尽(DB/Redis 连接池、Tomcat 线程池)、依赖超时(下游 RT 放大导致本服务线程被占满)。

补充:补①jstack 看线程状态(RUNNABLE/BLOCKED/WAITING)定位锁与池;②Full GC 判据(频率/GC 日志耗时/基线趋势);③Load 高 CPU 低=IO/锁等待;④线程池/连接池耗尽放大。

完整讲解见上方「完整讲解(权威版)」