btrace定位生产故障

简介: 现象某些请求通过数据访问层很慢并导致处理线程阻塞,从监控中未能检查到异常。编写btrace脚本@BTracepublic class DBProxyTrace { @OnMethod(clazz = "xxx.

现象

某些请求通过数据访问层很慢并导致处理线程阻塞,从监控中未能检查到异常。

编写btrace脚本

@BTrace
public class DBProxyTrace {

    @OnMethod(clazz = "xxx.xxx.QueryHandler", method = "query",
            location = @Location(Kind.RETURN))
    public static void trace2(String sql, @Duration long duration) {
        if (duration/1000000 > 10 * 1000) {
            com.sun.btrace.BTraceUtils.println(duration/1000000 + "ms");
            com.sun.btrace.BTraceUtils.println("this task executes more than 10s. the sql is : "
                    + sql);
            com.sun.btrace.BTraceUtils.println("jstack is : ");
            com.sun.btrace.BTraceUtils.jstack();
        }
    }
}

判断执行大于10秒的sql和堆栈信息。

编译脚本DBProxyTrace.java,确认脚本没有问题。

./bin/btracec  -cp build/ java/DBProxyTrace.java

执行脚本DBProxyTrace.class

./bin/btrace -cp build/ 17342  DBProxyTrace.class

信息

10468ms
this task executes more than 10s. the sql is : rollback
jstack is :
xxx.QueryHandler.query(QueryHandler.java:106)
xxx.net.AbstractConnection.onReadData(AbstractConnection.java:245)
xxx.net.NIOReactor$RW.run(NIOReactor.java:77)
java.lang.Thread.run(Thread.java:745)

定位

阻塞在事务回滚。

使用jstack进一步定位。

打印JVM堆栈

"$_NIOREACTOR-7-RW" prio=10 tid=0x00007f069856f000 nid=0xde1 waiting for monitor entry [0x00007f0677011000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1167)
    - waiting to lock <0x000000068086fbc0> (a oracle.jdbc.driver.T4CConnection)

结论

阻塞在了oracle驱动rollback动作,这里其实是因为oracle驱动为了保证串行请求响应而在底层加了锁,而这个通道被慢语句塞住了,所以rollback塞了。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

目录
相关文章
|
SQL 监控 网络协议
线上故障如何快速排查?来看这套技巧大全
有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器、Java应用、数据库、Redis、网络和业务六个层面分享线上故障排查的思路和技巧。较长,同学们可收藏后再看。
线上故障如何快速排查?来看这套技巧大全
|
SQL 前端开发 测试技术
一次纯线上接口异常的排查过程
一次纯线上接口异常的排查过程
124 0
|
4月前
|
测试技术
线上环境漏测问题根因分析
线上环境漏测问题根因分析
|
运维 监控 前端开发
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
|
缓存 运维 监控
用『逐步排除法』定位Java服务线上系统性故障(二)
用『逐步排除法』定位Java服务线上系统性故障
|
移动开发 运维 监控
用『逐步排除法』定位Java服务线上系统性故障(一)
用『逐步排除法』定位Java服务线上系统性故障
|
消息中间件 运维 监控
线上踩坑记:项目中一次OOM的分析定位排查过程!
线上踩坑记:项目中一次OOM的分析定位排查过程!
|
前端开发 JavaScript 程序员
如何追踪线上错误
如何追踪线上错误
169 0
如何追踪线上错误
|
XML Java BI
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
|
Arthas 缓存 开发框架
JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与JVM调优策略(2)
JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与JVM调优策略(2)
JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与JVM调优策略(2)