nereuschen / blog

blog
44 stars 11 forks source link

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

Open nereuschen opened 9 years ago

nereuschen commented 9 years ago

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

现象描述


当时的关键性监控


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呗,重新发布上线