您的位置:首页 > 数据库

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

2017-08-18 18:15 381 查看
线上某个业务应用的
SQL
的QPS监控发生了报警,QPS都飙到1.4w,平时才100不到,这节奏...

发布导致的?让童靴查了一下果然在这个点有发布,先果断回滚发布将风险降到最低

为了彻查原因,在回滚发布之前将一台服务器从线上摘下来,
保留现场


现象描述

当时的关键性监控
SQL的QPS从平时的100飙到1.4W



哪些SQL执行频率最高,每隔5秒这几个SQL的执行次数达**1W+**次



当然还有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呗,重新发布上线
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: