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内核设计剖析》

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

目录
相关文章
|
1月前
|
监控 安全 Java
【JAVA】uwb工厂人员定位系统:人员轨迹实时定位
Uwb人员精准定位系统需要具备实时性,将定位数据及时反馈给用户,方便用户进行人员管理和监控。
52 4
|
3月前
|
测试技术
线上环境漏测问题根因分析
线上环境漏测问题根因分析
|
8月前
|
Web App开发 Java 开发工具
systrace: 系统级跟踪工具的解析
systrace是Android4.1版本之后推出的,对系统Performance分析的工具,该工具结合Android 内核的数据,最终会生产html文件。 systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等
|
8月前
|
移动开发 运维 监控
用『逐步排除法』定位Java服务线上系统性故障(一)
用『逐步排除法』定位Java服务线上系统性故障
|
8月前
|
缓存 运维 监控
用『逐步排除法』定位Java服务线上系统性故障(二)
用『逐步排除法』定位Java服务线上系统性故障
|
前端开发 JavaScript 程序员
如何追踪线上错误
如何追踪线上错误
148 0
如何追踪线上错误
|
XML Java BI
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
JFR详细介绍与生产问题定位落地 - 2. 通过实例了解JMC 与 Event 结构与详细配置
|
Android开发 开发者
Android系统是如何计算应用启动耗时的?能否更精准定位性能瓶颈呢?
Android系统是如何计算应用启动耗时的?能否更精准定位性能瓶颈呢?
Android系统是如何计算应用启动耗时的?能否更精准定位性能瓶颈呢?
|
运维 Java
线上故障快速定位及恢复(下)
线上故障快速定位及恢复(下)
156 0
线上故障快速定位及恢复(下)
|
Java Linux
线上故障快速定位及恢复(上)
线上故障快速定位及恢复(上)
187 0
线上故障快速定位及恢复(上)