性能优化案例:高延迟排查
线上告警:核心接口 P99 延迟从 50ms 飙升至 500ms,持续 10 分钟。业务方反馈用户体验明显下降。这是典型的性能回退问题。
问题背景
接口 /api/order/create 的延迟指标:
排查步骤
第一步:确认影响范围
第二步:链路追踪分析
打开 SkyWalking,找到慢请求,查看调用链路:
问题定位到 payment-service。
第三步:Payment 服务分析
第四步:定位根因
外部 API 调用耗时 450ms,这不正常。
第五步:确认问题
问题根因
HTTP 连接池被回滚:某次部署误将连接池配置注释掉了,导致每次请求都创建新的 HTTP 连接,增加 300ms 连接建立时间。
修复方案
PaymentConfig.java
修复效果
排查流程总结
经验总结
教训一:连接池不能省
HTTP 连接池是生产环境的必备配置:
- 避免每次请求创建新连接
- 控制最大连接数,避免资源耗尽
- 设置合理的超时时间
教训二:配置变更要审查
关键配置(如连接池、超时、重试)的变更必须:
- 代码审查(Code Review)
- 测试环境验证
- 上线前确认
- 监控告警
教训三:监控要到位
添加关键指标监控:
本章小结
高延迟排查的标准流程:
- 链路追踪:快速定位慢服务
- trace 分析:定位慢方法
- 根因分析:找到问题根因
- 修复验证:确认修复有效
- 添加监控:防止回归
延伸思考
如果链路追踪也没有明显的慢服务怎么办?
可能的原因:
- GC 暂停(检查 GC 日志)
- 网络抖动(检查网络监控)
- 负载均衡问题(检查连接数)
- DNS 解析问题(检查 DNS 缓存)
建议用 perf 或 async-profiler 做一次完整的 CPU 采样。