本文へスキップ

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

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

ノート

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

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

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

Tips

インスタンス性能管理 > スレッドリスト/ダンプメニューのスレッドリストでWhaTap-ActiveStackDumpスレッドのCPU時間を確認し、オーバーヘッドを判断できます。

アクティブスタックの例

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)

最適化されたデータ収集

  • トランザクションを実行しているスレッドに対して、スタックをダンプします。

  • アクティブスタックダンプの時間間隔を調整できます。

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

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

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

    whatap.conf
    active_stack_count=100

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

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

  • async_stack_enabledの値をtrueに設定すると活性化されます。

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

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

    whatap.conf
    async_thread_match=http*,abc*

    スレッド名でスタックダンプの対象を識別します。コンマ(,)を区切り文字として使用してmatchを複数指定できます。

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

    whatap.conf
    async_thread_parking_class=sun.misc.Unsafe
    async_thread_parking_method=park

参考資料