当前位置: 首页 > news >正文

记一次线上接口超时排查:从日志到GC再到慢SQL的全过程

上周三下午,同事在群里甩了一张监控截图,某个订单查询接口P99延迟突然从80ms飙到3s+,偶尔还直接504。

当时第一反应是——谁又上了什么骚操作。

先看日志,别瞎猜

直接去ELK捞日志,按traceId串了一下调用链,发现大部分耗时都卡在一个查订单列表的RPC调用上。

这个接口平时QPS不高,大概200左右,平时响应很稳,突然炸了就很反常。

// 大致逻辑,简化版 List<Order> orders = orderMapper.selectByUserId(userId);

SQL本身不复杂,就是按user_id查,加了索引,理论上不该慢。

看监控,排除网络抖动

先看了下网络层面的监控,丢包率正常,TCP重传也没异常。

然后看下游数据库的连接池状态,HikariCP的active连接数已经打满了,wait线程一堆。

到这里基本可以确认——不是网络问题,是数据库那边扛不住了

慢SQL日志里捞线索

去数据库侧看了下慢查询日志,果然有一堆类似的SQL,执行时间从1s到5s不等。

但诡异的是,这条SQL在测试环境跑得飞快,explain出来也走的索引,type是ref,key_len也正常。

这时候有个同事提了一嘴:是不是数据量变了?

去线上库一查,那个user_id对应的订单数据量大概有12万条,而且没有分页,直接全量select。

SELECT * FROM t_order WHERE user_id = 10086;

12万条,没limit,全量拉回来。

之前这个用户是个普通用户,数据量小,所以一直没暴露。这次是个大客户的测试账号,数据量一上来就炸了。

根因

说白了就是:

  • 代码里没做分页,默认全量查
  • 测试数据量太小,没覆盖到大用户场景
  • 连接池被打满后,其他正常请求也被拖死了
怎么修的

改动不大,主要就两件事:

  1. 接口加上分页参数,默认page_size=20,最大不超过100
  2. 对全量查询的场景做了兜底,超过阈值直接拒绝并告警
if (count > MAX_ALLOWED) { log.warn("user_id={} order count={} exceed limit", userId, count); throw new BizException("数据量过大,请使用筛选条件"); }

另外顺手把select *改成了指定字段,减少网络传输量。

几个教训
  • 测试数据要贴近真实分布,不能全是几条数据的理想场景
  • 分页是基本功,任何列表查询都应该有分页兜底
  • 连接池打满是最危险的信号之一,一个慢请求能把整个服务拖垮
  • 监控告警要配好,P99超阈值就报警,别等用户来反馈
最后

这种问题其实不算难排查,关键是要有一个清晰的排查路径:

日志 → 调用链 → 监控 → 慢SQL → 数据分布

一步一步缩小范围,别一上来就怀疑框架、怀疑JVM、怀疑玄学。

大部分线上问题,根因都很朴素。

http://www.cnnetsun.cn/news/4217076.html

相关文章:

  • 单相感应电动机原理与维修:从启动方式到电容选配
  • CMake实战指南:从构建系统生成器到跨平台项目高效管理
  • Vim宏录制:从原理到实战,掌握q记录器提升文本编辑效率
  • 主流 Agent 框架横向对比:LangChain、LangGraph、AutoGen 与 CrewAI 怎么选
  • 从视觉情报分析赛题看CV技术实战:目标检测、多目标跟踪与事件推理
  • 教学用角膜地形图仪,为什么需要Scheimpflug断层?
  • C盘空间告急?一文教你将Codex等缓存安全迁移至D盘
  • AI绘画工作流实战:用Stable Diffusion批量生成三张Q版头像
  • 基于SonarQube与Ollama构建自动化代码审查与注释生成流程
  • 设计模式-基础篇(六大原则)
  • 现场活动画面组织控制及抽奖的使用疑难问题汇编
  • 论多源异构数据集成与数据架构设计
  • 2026年烟台做智慧排水监测系统的公司前10名有哪些?
  • PyWenCai:用 Python 调用同花顺问财,5 分钟搭好金融数据采集管道
  • 鸿蒙 ArkTS 实战|二元一次方程组应用:两直线交点求解 + 三种解的可视化判定
  • 144、影像算法DSP/NPU Offloading——降噪/超分/语义分割算子在高通/联发科/海思平台的部署选择
  • Edge浏览器JavaScript脚本开发全攻略:从用户脚本到扩展与自动化
  • 后端转Agent开发已上岸,我说说怎样学更容易找到工作 !
  • Python装饰器深度解析:从函数对象到实战应用
  • 071、6D位姿估计基础与PPF:点对特征的刚体配准原理
  • 从QClaw到AI Agent:揭秘GUI自动化与安全实践
  • 347H耐中高温不锈钢材料347H耐热螺丝347H不锈钢螺柱347H不锈钢螺栓347H螺丝347H螺母347H不锈钢螺丝347H牙棒-东明天津紧固件
  • 基于TipTap构建AI协同写作应用:架构设计与实战指南
  • 年薪40W起步的AI测开岗,面试官到底在考什么?
  • MySQL 插入冲突了怎么办?两种处理方式入门笔记
  • Z型钢直销厂家排行榜新鲜出炉,这份榜单帮你避开选购陷阱
  • 微软常用运行库合集(Visual C++)安装与使用教程
  • 一个搜索框接通 7 大音乐平台:Listen1 免费音乐聚合扩展完整上手攻略
  • Windows + WSL 环境下使用 LangGraph PostgresSaver 连接 PostgreSQL 缓慢的问题
  • Android开发面试全攻略:从基础到架构设计