先把问题看清楚:为什么要按层次排查

有点像看病:发烧可能是感冒、也可能是肺炎。后台卡顿也一样,不要一上来就改代码。先确定是“谁”在慢——浏览器、网络、前端服务、后端服务、还是第三方。按层次来,效率会高很多。
层次模型(简单版)
- 客户端(浏览器、缓存、插件、设备)
- 网络(本地网络、运营商、DNS、CDN)
- 接入层(负载均衡、SSL、NGINX)
- 应用层(Web 进程、线程、事件循环、代码)
- 数据层(数据库、缓存、队列、外部 API)
- 基础设施(主机资源、存储、磁盘 I/O、内核设置)
排查思路:一步一步来(费曼式的简单步骤)
我一般喜欢这样做,像在解一道多步题:
- 重现问题:先自己在相同或相近环境重现卡顿(浏览器、账号、网络环境)。
- 收集证据:浏览器 DevTools(Network)抓请求时间线;服务器访问日志;应用错误日志;监控面板(CPU、内存、磁盘、网络、延迟分位数 p50/p95/p99)。
- 定位边界:是所有请求慢还是个别接口慢?是单用户还是全部用户?高并发下还是低并发下才出现?
- 分层排查:客户端 → 网络 → 接入 → 应用 → 数据库 → 第三方。
- 短期救急:合理流量限流、开启缓存、临时扩容、重启有状态进程(谨慎)、回滚最近发布。
- 长期修复:优化 SQL 与索引、引入缓存、异步化耗时任务、合理限流与熔断、容量规划。
常见成因与如何验证(逐项详解)
1. 客户端问题
有时问题其实在用户端。检查点:
- 使用浏览器开发者工具查看资源加载时间——DNS、TLS、TTFB(Time To First Byte)、Content Download。
- 建议让用户尝试清除缓存或用无痕浏览,禁用浏览器插件,换电脑或手机试试。
- 低端设备或内存占用过高也会显得“卡”。
2. 网络与 DNS
网络波动很常见,尤其是移动网络或跨区域访问。
- 用 ping / traceroute / mtr 看丢包与跳数。
- 检查 DNS 解析时间,DNS 污染或解析到错误节点会造成访问慢。
- 如果使用 CDN,确认边缘节点是否正常,是否发生回源过多导致回源压力。
3. 接入层与负载均衡
负载均衡配置或 SSL 终端也会成为瓶颈。
- 检查 NGINX/HAProxy 的连接数、worker 线程、超时配置、keepalive 设置。
- 查看证书过期、SSL 握手时间异常。
- 负载均衡器健康检查失败会导致流量聚集到少数节点。
4. 应用服务本身
应用层通常最复杂,容易出现阻塞或资源耗尽。
- 看进程 CPU、内存、线程数。
- 抓取线程/协程/堆栈快照(thread dump 或堆栈采样),找阻塞点。
- 检查日志是否有大量超时、异常或频繁 GC(JVM 环境)。
- 查看连接池是否耗尽(数据库连接池、HTTP 客户端连接池)。
5. 数据库与缓存
数据库慢查询与缓存不命中是最常见的后台卡顿原因之一。
- 打开慢查询日志,找 p95/p99 的慢 SQL,检查是否缺索引或表扫描。
- 检查连接数、锁等待、事务长时间未提交导致阻塞。
- 缓存(Redis/Memcached)是否失效、容量是否满、是否发生频繁淘汰(eviction)。
6. 第三方服务
支付、短信、地图等第三方 API 响应慢也会连带影响后台。
- 在应用中设置调用超时并做好降级策略。
- 在监控中单独上报第三方调用延迟与错误率。
常用工具与命令(实践派)
下面列几个常见快速验证的工具,实际操作就靠它们了:
- 浏览器 DevTools(Network / Performance)
- curl -v 或 curl –trace-time 查看请求细节
- ping / traceroute / mtr
- top / htop / iostat / vmstat / sar / dstat
- nginx/haproxy 状态页面、数据库慢查询日志、Redis INFO
- 应用层:thread dump、GC 日志、APM(如 SkyWalking、Pinpoint、NewRelic 等)
对症下药:短期缓解与长期改进
有急有缓,先稳住再改底层设计。
短期缓解(能立刻做的事)
- 重启出现问题的服务进程(注意是否为有状态服务,先做灰度或单节点重启)。
- 临时扩容实例或增加副本(水平扩展),并调整负载均衡权重。
- 回滚最近一次上线(如果问题与发布相关)。
- 开启或扩大缓存(静态内容 CDN、Redis 缓存热点接口)。
- 临时限流、排队或只保留核心功能以降低负载。
长期改进(需要规划与代码/架构改造)
- 优化数据库:加索引、拆表、读写分离、优化 SQL。
- 引入或补齐缓存策略:缓存穿透、雪崩防护、热点缓存预热。
- 把长耗时操作异步化,使用消息队列做削峰。
- 合理设置连接池与线程池大小,避免资源争抢。
- 完善监控与告警:设置关键 SLA 指标的 p95/p99 告警。
- 做容量规划与压力测试,验证扩容效果。
一个小表格,供排查时快速参考
| 检查项 | 快速判断方式 | 应对措施 |
| 客户端 | DevTools、无痕模式 | 清缓存、升级浏览器、提示用户 |
| 网络/DNS/CDN | ping/traceroute、curl TTFB | 切换 DNS、调整 CDN 配置、回源限流 |
| 应用 | CPU/内存/线程 Dump | 重启或扩容、优化代码 |
| 数据库/缓存 | 慢查询日志、Redis INFO | 建索引、加缓存、调整连接池 |
一些容易被忽视但很重要的细节
- 日志量过大:日志写满磁盘或写入过多会拖慢磁盘 I/O。
- 监控盲点:没有 p99 指标就会看不到极端慢请求。
- 灰度回滚策略:发布后快速回滚能力可以极大缩短故障时间。
- 配置错误:误把缓存 TTL 设为 0 或关闭某个节点健康检查都会造成突发问题。
写到这里,我想起几次线上故障,很多时候是几件小事叠加:一次发布中忘了更新连接池、外面 CDN 回源正好高峰、还有个第三方接口恰巧超时,最后看起来像“后台卡顿”,其实每层都有问题。所以别急着大刀阔斧,按顺序查,先把用户体验拉回正常,再做深入优化。好了,就这些零碎想法,边写边想,可能还有遗漏,以后再补。
