接口响应太慢如何处理
接口响应慢是后端开发最常遇到的线上问题。排查思路:先宏观定位(所有接口还是单个接口)→ 逐层排查(网络→服务器→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)
- top -H -p [PID] 找到CPU占用最高的线程ID
- 线程ID转16进制:printf "%x\n" [线程ID]
- jstack [PID] | grep [16进制线程ID] -A 30 查看线程堆栈
- 定位到具体代码行,判断是否死循环、死锁、无限递归
常见原因: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) → 最后业务逻辑+缓存+第三方。