액티브 트랜잭션

진행 중인 트랜잭션을 액티브 트랜잭션이라고 합니다. 액티브 트랜잭션에서 정기적으로 덤프한 스택을 액티브 스택이라 합니다.

와탭 에이전트는 매 10초(옵션 가능)마다 액티브 트랜잭션에 대해서 액티브 스택을 덤프하고 이것을 서버에 전송합니다. (active_stack_second=10)

컴팩트한 액티브 스택 수집

액티브 스택은 스레드 덤프를 정기적으로 수행하기 때문에 잘못 구현되면 에이전트에 오버헤드가 커질 수 있습니다. 와탭은 에이전트 부하를 최소화하면서 액티브 스택을 수집하기 위해 다양한 옵션들을 가지고 있습니다.

서버 > 더보기 > 쓰레드 목록/덤프 메뉴에서 스레드 목록 중에 "WhaTap-ActiveStackDump" 쓰레드의 CPU Time을 확인하면 오버헤드를 판단할 수 있습니다.
액티브 스택의 예
java.lang.StringBuffer.append(StringBuffer.java:309)
java.util.regex.Matcher.appendReplacement(Matcher.java:839)
java.util.regex.Matcher.replaceAll(Matcher.java:906)
java.lang.String.replaceAll(String.java:2162)
core.log.triggers.TriggerRegister.changeNotify(TriggerRegister.java:114)
core.log.aop.handler.DaoInfo.log(DaoInfo.java:141)
core.log.aop.handler.DaoInfo.doAround(DaoInfo.java:102)
core.log.aop.reflection.profiler.AroundProfiler.invoke(AroundProfiler.java:19)
com.sun.proxy.$Proxy39.getUpdateCount(Unknown Source)
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getNextResultSet(DefaultResultSetHandler.java:256)
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:193)
org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)

* * *

sun.reflect.GeneratedMethodAccessor140.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
최적화된 데이터 수집
  • 트랜잭션을 수행 중인 쓰레드에 대해서만 스택을 덤프합니다.

  • 액티브 스택 덤프 시간 간격을 조정할 수 있습니다. (active_stack_second=10)

  • 액티브 스택의 최대 라인에 제한되어 있습니다. Top 라인에서부터 기본 50라인을 수집합니다. (trace_active_callstack_depth=50)

  • 액티브 스택의 각 라인은 해쉬 처리되어 수집됩니다.(text는 한 번만)

  • 한 타임에 수집되는 최대 액티브 스택 개수도 제한되어 있습니다.(active_stack_count=100)

Background Thread에 대한 액티브 스택

@since v1.6.2
기본적으로 액티브 스택은 트랜잭션이 수행되고 있는 쓰레드의 스택을 말합니다. 하지만 일부 백그라운드 쓰레드에 대해서도 스택을 분석할 필요가 있을 수 있습니다. 이때 옵션을 통해서 백그라운드 쓰레드에 대한 액티브 스택을 확보할 수 있습니다.

async_stack_enabled=false

async_stack_enabled를 true로 설정하면 활성화됩니다.

active_stack_second=10

스택 덤프 간격은 포그라운드 액티브 스택 설정에 따라갑니다.

async_thread_match=http*,abc*

대상 쓰레드 이름을 지정할 때는 '*' 사용하여 문자열 패턴을 지정합니다.

쓰레드 이름으로 스택 덤프 대상을 식별합니다. ","를 사용하여 match를 여러 개를 지정할 수 있습니다.
async_thread_parking_class=sun.misc.Unsafe
async_thread_parking_method=park

스택의 Top 메소드가 async_thread_parking에 등록된 클래스/메소드일때 쓰레드가 파킹 상태에 있다고 판단하고 덤프를 생성하지 않습니다.