线上应用SQL执行次数异常飙高100倍的排查过程

线上某个业务应用的SQL的QPS监控发生了报警,QPS都飙到1.4w,平时才100不到,这节奏...
发布导致的?让童靴查了一下果然在这个点有发布,先果断回滚发布将风险降到最低
为了彻查原因,在回滚发布之前将一台服务器从线上摘下来,保留现场

现象描述


当时的关键性监控

  • SQL的QPS从平时的100飙到1.4W
    sql-qps
  • 哪些SQL执行频率最高,每隔5秒这几个SQL的执行次数达**1W+**次
    top-sql
  • 当然还有MySQL的一些监控,比如网络流量,MySQL command的QPS
  • 其他核心接口未发现监控异常的情况,说明只是SQL的QPS飙高了,并不影响应用(主要归功于平时我们对SQL优化比较重视,所以即使QPS飙高了,核心接口未收到影响)

排查思路


SQL执行次数持续飙高,说明这些TOP3的SQL一直在被执行,只要定位出是哪些线程一直处于RUNNABLE状态,这个问题就初步定位了。所以可以先使用jstack dump出线程堆栈信息

排查步骤


1.Dump线程堆栈

在JAVA的bin目录下通过以下命令dump线程栈信息

$ sudo -u tomcat ./jstack -l pid >~/threadDump1.log

可以每隔2秒dump一次,然后对比这些线程栈,看看哪些线程的一直是RUNNABLE状态

2.对比线程堆栈信息

发现这个thread比较可疑

"pool-12-thread-2" prio=10 tid=0x00007f7818006800 nid=0x2227 runnable [0x00007f779e2c4000]
   java.lang.Thread.State: `RUNNABLE`
    at java.lang.Throwable.fillInStackTrace(Native Method)
    - locked <0x00007f7892778a20> (a java.sql.SQLException)
    at java.lang.Throwable.<init>(Throwable.java:196)
    at java.lang.Exception.<init>(Exception.java:41)
    at java.sql.SQLException.<init>(SQLException.java:52)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    ......
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:57)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)
    ......
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
    at $Proxy33.queryXxxName(Unknown Source)
    at com.XXX.queryXxxName(XXXImpl.java:361)
    at com.XXX.queryXxxListByUserId(XXXImpl.java:405)
    at sun.reflect.GeneratedMethodAccessor433.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    ......
    at $Proxy37.queryXxxListByUserId(Unknown Source)
    at com.XXX.saveXxxPrivList(XXXImpl.java:238)
    at com.XXX.changeXxxByXxxIds(XXXImpl.java:170)
    at com.XXXThread.run(XXXThread.java:72)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)

3.查看业务代码

通过看业务代码,DAO中涉及到的SQL正是上面说到的TOP3的SQL


修复问题

最后...FIX BUG呗,重新发布上线

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值