머리말
프로그램 실행에 대해 더 자세한 내용을 알아야 할 경우가 많지만 개발 중에 프로그램의 실행 세부 정보를 모두 인쇄하는 것은 불가능합니다. 일반적으로 이때 할 수 있는 작업은 코드를 수정하고 다시 배포한 다음 다시 관찰하는 것입니다. 참조된 다른 외부 패키지 등과 같이 변경하기 어려운 경우 BTrace는 코드를 변경하거나 애플리케이션을 다시 시작하지 않고도 프로그램 실행 세부 정보를 동적으로 볼 수 있는 도구입니다. 다음 기사에서는 생산 오류를 찾는 btrace 방법을 소개합니다. , 도움이 필요한 친구가 참조할 수 있습니다.
현상
일부 요청은 데이터 액세스 계층을 통해 속도가 매우 느려 처리 스레드가 차단되고 모니터링에서 예외를 감지할 수 없습니다.
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)
결론
Blocked The oracle 드라이버 롤백 작업은 실제로 Oracle 드라이버가 직렬 요청 응답을 보장하기 위해 하위 계층에 잠금을 추가하고 이 채널이 느린 명령문에 의해 차단되므로 롤백이 차단되기 때문입니다.
btrace의 생산 결함 찾기 방법과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!