【场景题】线上接口响应慢,应该如何排查问题?
【场景题】线上接口响应慢,应该如何排查问题?
- 1. 耗时高分析思路
- 2. 方法论
- 3. 具体排查步骤详解
- 3.1 问题定位
- 3.2 网络、中间件、外部依赖排查
- 3.3 服务端性能排查
- 4. 哪个接口耗时高?
- 5. 如果接口监控与接口访问日志都没有,也可以通过arthas的watch命令找接口
1. 耗时高分析思路

2. 方法论
面试问到这个问题,面试官其实想听到一些方法论的东西,并不想了解零零散散的排查过程。
总体思路:先宏观、再深入、再优化。
核心理念:“监控先行 → 问题定位 → 根因分析 → 优化闭环”
接口慢问题,本质是请求在链路中某一环节耗时异常。排查过程应遵循以下层次:
- 宏观定位问题范围(单接口 or 全局慢)
- 链路级追踪耗时分布(发现“瓶颈点”)
- 深入分析具体环节(CPU、内存、DB、缓存、网络等)
- 提出优化方案并验证效果
- 形成长期治理机制
| 环节 | 目标 | 工具 | 关键指标 | 结果 |
|---|---|---|---|---|
| 1. 监控告警 | 是否有慢接口 | Prometheus / Grafana / SkyWalking | RT、QPS、错误率 | 确认是否整体慢或单接口慢 |
| 2. 链路追踪 | 找出耗时环节 | SkyWalking / Zipkin | Trace Timeline | 精确定位是DB、Redis、RPC等慢 |
| 3. 资源分析 | 看系统瓶颈 | top / vmstat / iostat / jstat | CPU、GC、IO、线程 | 是否CPU打满、GC频繁、磁盘慢 |
| 4. 代码分析 | 查逻辑问题 | Arthas / JFR / jstack | 方法耗时、锁等待 | 找到热点代码或死锁点 |
| 5. 优化方案 | 解决性能瓶颈 | 压测 + 调优 | TPS、RT、CPU | 优化后效果验证 |
3. 具体排查步骤详解
3.1 问题定位
-
范围判断
- 是单个接口慢,还是全站慢?
- 是持续性(系统性瓶颈)还是突发性(资源抢占)?
- 是否与业务高峰(如双11、秒杀)相关?
- 是否只在特定参数或用户下出现?
-
监控告警分析
- 在 Prometheus + Grafana 或 SkyWalking 看:
- RT(响应时间)趋势
- QPS 变化(是否突增)
- 错误率(是否超时/拒绝)
- 判断是否是单实例问题(CPU打满)或系统性问题(全体实例慢)
- 在 Prometheus + Grafana 或 SkyWalking 看:
-
分布式链路追踪
- SkyWalking / Zipkin:
- 查看 Trace 时间分布:例如 Controller 5ms → Service 10ms → Redis 400ms。
- 找出具体瓶颈环节(如 Redis 慢、MySQL 慢、RPC慢)。
- SkyWalking / Zipkin:
-
日志排查
- ELK 平台聚合日志:关注慢SQL、错误堆栈、线程阻塞。
- 检查应用日志:
grep "Timeout" application.log
grep "Slow query" application.log
3.2 网络、中间件、外部依赖排查
- 网络层
- 延迟检测
ping / traceroute / mtr 目标主机 - 丢包检测 tcpdump抓包分析重传率,优化Nginx的keepalive_timeout。查看网络监控看板获取丢包率
- 延迟检测
- MySQL 检查锁等待 (show engine innodb status)、优化索引、分页、缓存 、观察慢SQL
- 外部依赖 检查调用外部服务(RPC/HTTP)耗时、查看超时配置(默认过长会拖慢线程)
- MQ 查看堆积量,必要时增加消费线程池。
- Redis:
redis-cli --latency检测集群响应时间,排查大Key/热Key,检查Redis集群的缓存命中率,连接数监控
3.3 服务端性能排查
- 服务器资源瓶颈分析
- CPU:使用top -H定位高负载线程,结合jstack分析线程栈(如死循环、锁竞争)。
- 内存:通过jstat -gcutil观察GC频率,jmap排查内存泄漏(如未释放的Redis连接池)、jmap -histo 查大对象
- 磁盘IO:iostat检查磁盘负载,优化日志写入策略(如异步刷盘)。
- JVM调优
- GC策略:高并发场景优先选用G1,调整MaxGCPauseMillis控制停顿时间。
- 堆外内存:检查Netty等框架的DirectBuffer泄漏(Native Memory Tracking)
3.代码逻辑排查 - 检查是否存在不合理代码逻辑:循环查询数据库、同步调用多个外部接口等
4. 哪个接口耗时高?
一般各个服务都有接口监控,可以通过监控确定哪个接口耗时高。
比如有SkyWalking,它会展示出每一个与网络有关的耗时,比如:读写数据库、读写Redis、SpringCloud调用、Dubbo调用等。这样就能立马定位是哪次操作耗时了。
同时,SkyWalking可以记录每一个SQL语句,可以帮助定位。

如果没有接口监控的话,可以试着找找有没有接口访问日志,它记录了接口调用日志,然后通过Linux命令找出耗时高的接口,如下:

lsof -c java | grep log
lsof -c java-c 参数用于指定进程名称(command),表示只显示命令名以 “java” 开头的进程所打开的文件。
查找所有由 Java 进程打开的文件中,名称里包含 “log” 的那些文件。
5. 如果接口监控与接口访问日志都没有,也可以通过arthas的watch命令找接口



