线上应用SQL执行次数异常飙高100倍的排查过程
2017-08-18 18:15
381 查看
线上某个业务应用的
发布导致的?让童靴查了一下果然在这个点有发布,先果断回滚发布将风险降到最低
为了彻查原因,在回滚发布之前将一台服务器从线上摘下来,
当时的关键性监控
SQL的QPS从平时的100飙到1.4W
哪些SQL执行频率最高,每隔5秒这几个SQL的执行次数达**1W+**次
当然还有MySQL的一些监控,比如网络流量,MySQL command的QPS
其他核心接口未发现监控异常的情况,说明只是SQL的QPS飙高了,并不影响应用(主要归功于平时我们对SQL优化比较重视,所以即使QPS飙高了,核心接口未收到影响)
SQL执行次数持续飙高,说明这些TOP3的SQL一直在被执行,只要定位出是哪些线程一直处于
在JAVA的bin目录下通过以下命令dump线程栈信息
可以每隔2秒dump一次,然后对比这些线程栈,看看哪些线程的一直是
发现这个thread比较可疑
通过看业务代码,DAO中涉及到的SQL正是上面说到的TOP3的SQL
最后...FIX BUG呗,重新发布上线
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呗,重新发布上线
相关文章推荐
- 一则线上MySql连接异常的排查过程
- 一则线上MySql连接异常的排查过程
- 一则线上MySql连接异常的排查过程
- hive 命令行提交sql 执行过程
- sql server service broker中调用存储过程执行跨库操作,不管怎么设置都一直提示 服务器主体 "sa" 无法在当前安全上下文下访问数据库 "dbname"。
- Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
- Java线上应用故障排查之二:高内存占用
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增记录SQL执行过程
- 线上应用故障排查之一:高CPU占用(转)
- 调用DATASNAP+FIREDAC的远程方法有时会执行二次SQL或存储过程的BUG
- Oracle执行SQL语句的过程
- Java线上应用故障排查之一:高CPU占用
- 应用Druid监控SQL语句的执行情况
- 线上应用故障排查之一:高CPU占用
- SQL2000系统表、存储过程、函数的功能介绍及应用2009年01月21日 星期三 11:38虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。因为SQL
- Oracle SQL的执行过程
- 存储过程测试sql执行时间间隔毫秒级
- SQL查询执行过程
- sql语句执行过程
- SQL存储过程在.NET数据库中的应用