btrace 포지셔닝 생산 고장 방법 예시

앞말
많은 경우에 우리는 더 많은 프로그램의 실행 세부 사항을 알아야 하지만, 개발할 때 프로그램의 모든 실행 세부 사항을 로그에 출력할 수도 없다. 보통 이때 취할 수 있는 것은 코드를 수정하고 재배치한 후에 관찰하는 것이다. 그러나 이런 방법은 온라인 응용에 있어서 좋지 않다. 다른 한편, 고치기 어려운 코드, 예를 들어 인용된 다른 외부 패키지 같은 것을 만나면번거롭습니다. 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)
결론
oracle 드라이브 롤백 동작에 막혔습니다. 여기는 사실oracle 드라이브가 직렬 요청 응답을 확보하기 위해 밑에 자물쇠를 넣었기 때문에 이 채널은 느린 문장에 막혀서 롤백이 막혔습니다.
총결산
이상은 바로 이 글의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 어느 정도 도움이 되고 의문이 있으면 댓글로 교류하시기 바랍니다.

좋은 웹페이지 즐겨찾기