跳转到内容

接口响应太慢如何处理

💡

接口响应慢是后端开发最常遇到的线上问题。排查思路:先宏观定位(所有接口还是单个接口)→ 逐层排查(网络→服务器→JVM→业务代码→SQL→第三方)。本文梳理完整的排查链路和解决方案。


一、排查总思路:先定位范围

第一步判断:是所有接口都慢,还是某个特定接口慢?

现象

排查方向

所有接口都慢

服务器资源(CPU/内存/IO)、数据库连接池、网络带宽、GC频繁

某个接口慢

慢SQL、索引失效、业务逻辑复杂、第三方调用超时

某个用户慢

该用户数据量大(如大V好友排行榜)、特定数据问题


二、网络层排查

2.1 ping检查连通性

2.2 其他网络工具

命令

作用

traceroute

追踪数据包经过的路由节点,定位网络瓶颈在哪一跳

curl -w

curl -w "@curl-format.txt" URL,查看DNS解析/TCP握手/TLS/传输各阶段耗时

tcpdump

抓包分析TCP重传、窗口大小等


三、服务器资源排查

3.1 CPU和内存

3.2 CPU飙高排查(Java)

  1. top -H -p [PID] 找到CPU占用最高的线程ID
  2. 线程ID转16进制:printf "%x\n" [线程ID]
  3. jstack [PID] | grep [16进制线程ID] -A 30 查看线程堆栈
  4. 定位到具体代码行,判断是否死循环、死锁、无限递归
💡

常见原因:HashMap并发导致环形链表死循环(JDK7)、while(true)无break、死锁(多个线程互相等待)、大量正则匹配等。

3.3 连接池耗尽

📌

连接池大小公式(参考):connections = ((core_count * 2) + effective_spindle_count)。通常20-50足够。连接池耗尽 → 请求排队等待 → 响应超时。


四、JVM层面排查

4.1 JVM调优参数

4.2 排查GC问题

工具/命令

作用

jstat -gc [PID] 1000

每秒查看GC统计(YGC/FGC次数和时间)

jmap -heap [PID]

查看堆内存各区域使用情况

jmap -histo [PID]

查看内存中对象数量和占用(快速定位内存泄漏)

Arthas dashboard

实时面板,一眼看GC/内存/线程状况


五、慢SQL排查(最常见原因)

5.1 EXPLAIN分析

5.2 慢SQL优化清单

#

优化手段

说明

1

加索引

高频WHERE条件字段建索引,联合索引遵循最左前缀

2

避免索引失效

禁止左模糊、列上计算/函数、隐式类型转换

3

分页查询

大数据量必须LIMIT分页,避免一次返回全部

4

覆盖索引

SELECT需要的列尽量包含在索引中,减少回表

5

JOIN代替子查询

子查询产生临时表,JOIN性能更优

6

深度分页优化

LIMIT 1000000,10 → 改为游标分页


六、缓存策略

📌

如果SQL已经优化到极致仍然慢,考虑引入缓存。

  • Redis缓存:热点数据(首页排行榜、配置信息、用户信息)存入Redis,设置合理过期时间
  • 本地缓存:Caffeine/Guava Cache,适合极少变化的配置数据,微秒级响应
  • 多级缓存:本地缓存(Caffeine) → Redis → 数据库,逐级回源
  • 缓存更新策略:先更新DB再删缓存(Cache Aside);或通过Canal监听binlog异步更新

七、第三方服务调用

💡

第三方服务的响应时间不受你控制,必须做好超时、异步和降级。

7.1 设置超时时间

7.2 异步调用 + 熔断降级


八、排查工具汇总

层次

工具

用途

网络

ping / traceroute / curl -w / tcpdump

连通性、延迟、丢包、路由追踪

服务器

top / htop / docker stats / vmstat / iostat

CPU/内存/IO/磁盘

JVM

jstack / jstat / jmap / Arthas / VisualVM

线程堆栈、GC、堆内存、方法耗时

数据库

EXPLAIN / SHOW PROCESSLIST / 慢查询日志

执行计划、当前连接、慢SQL

应用

日志 / SkyWalking / Pinpoint / Prometheus+Grafana

链路追踪、耗时分布、监控告警


排查口诀:先宏观(全慢还是单慢) → 先网络(ping) → 再服务器(top/CPU) → 再JVM(jstack/GC) → 再SQL(EXPLAIN) → 最后业务逻辑+缓存+第三方。