本文へスキップ

アクティブトランザクション

進行中のトランザクションをアクティブトランザクションと呼びます。アクティブトランザクションで定期的にダンプされるスタックはアクティブスタックと呼ばれます。

ノート

WhaTapエージェントは、10秒(オプションで調整可能)ごとにアクティブトランザクションに対して、アクティブスタックをダンプし、サーバーに送信します。active_stack_second=10

コンパクトなアクティブスタックの収集

アクティブスタックはスレッドダンプを定期的に実行するため、誤った実装をするとエージェントのオーバーヘッドが増加する可能性があります。WhaTapはエージェント負荷を最小限に抑えながらアクティブスタックを収集するために、様々なオプションがあります。

Tips

サイトマップ > スレッド一覧/ダンプメニューのスレッドリストでWhaTap-ActiveStackDumpスレッドのCPU Timeを確認することでオーバーヘッドを判断できます。

アクティブスタックの例

JAVA
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

  • アクティブスタックの最大行に制限されます。トップラインから基本の50行を収集します。

    trace_active_callstack_depth=50

  • アクティブスタックの各行をハッシュ処理して収集します。テキストは1度だけ収集します。

  • 一度に収集される最大のアクティブスタックの数も制限されます。

    active_stack_count=100

Background Threadのアクティブスタック

基本的にアクティブスタックは、トランザクションが実行されているスレッドのスタックです。ただし、一部のバックグラウンドスレッドのスタックも分析が必要な場合があります。この場合、オプション設定でバックグラウンドスレッドのアクティブスタックが取得できます。1.6.2以降のバージョンからサポートします。

  • async_stack_enabledの値をtrueに設定するとアクティブになります。

    async_stack_enabled=false
  • スタックダンプの間隔は、フォアグラウンドアクティブスタックの設定に準じます。

    active_stack_second=10
  • 対象スレッド名を指定する場合は、*を使用して文字列パターンを指定します。

    async_thread_match=http*,abc*

    スレッド名でスタックダンプ対象を識別します。,を使用して複数の一致を指定できます。

  • スタックの上位メソッドがasync_thread_parkingに登録されたクラス/メソッドの場合、スレッドがパーキング状態にあると判断してダンプを生成しません。

    async_thread_parking_class=sun.misc.Unsafe
    async_thread_parking_method=park

参考資料