スタック
ホーム画面 > プロジェクト選択 > 分析 > スタック
特定の時間帯の呼び出しスタックの頻度とメソッド、トランザクションに関する詳細情報が確認できます。トップスタック, ユニークスタック, アクティブスタックが照会できます。トップスタックは、呼び出し頻度の高いメソッドの使用量を示し、ユニークスタックは、同じ呼び出しスタックの頻度を分析します。アクティブスタックは、実行中のトランザクションのスタック情報を定期的に収集し、リアルタイムのパフォーマンス分析ができます。
スタック分析機能はJava及びPython、.NETのモニタリングで提供します。
主な機能の案内
次の主な機能を利用できます。スタックの照会により、アプリケーションのパフォーマンスの問題をすばやく識別し、解決できます。特定メソッドの呼び出し頻度、呼び出し経路、応答時間などを確認し、性能向上のための改善策が用意できます。
-
スタックタイプの選択
トップスタック, ユニークスタック, アクティブスタック中から希望するスタックを選択して照会できます。
-
時間選択 / 開始日:照会する時間を設定します。特定の時間帯のスタックを照会したり、目的の期間を設定できます。スタックの種類によっては、照会できる期間が制限されます。
ノートトップスタック及びユニークスタックを照会できる最大期間は3日です。
-
アプリケーション:照会するエージェントを選択できます。特定のエージェントを選択でき、何も選択しないとプロジェクトに含まれるすべてのエージェントを対象に照会します。
-
カラム選択:希望するカラム項目を表示または非表示します。
-
比較する:同じフィルター条件で1日以内に照会する際、選択したスタックを別の時間帯と比較できます。この機能で、時間による呼び出しスタックの変化を把握し、性能のトレンドを確認できます。詳細については、次の文書を参照にしてください。
-
:各スタック タイプのテーブル リストからスタックまたはトランザクション項目を拡張すると、一番右側にスナップショット アイコンが表示されます。このアイコンを選択すると、スタックまたはトランザクション情報を画像ファイルに保存できます。
基本的な使い方
-
画面から照会するスタックタイプを選択します。
-
時間選択または開始日で希望する照会時間を設定します。
-
アプリケーションで、照会するエージェントを選択します。何も選択しないと、エージェント全体を対象に照会します。
-
ボタンを選択してください。
照会結果をスタックテーブルの一覧から確認できます。
トップスタック
トップスタックでは、呼び出し頻度が最も高いメソッドの情報を提供します。スタックの最上段に位置するメソッドの呼び出し頻度により、サービスに最も影響を与えるメソッドを素早く確認できます。メソッドの呼び出し頻度を把握し、CPUまたはメモリに負荷がかかる原因を分析できます。この機能で性能改善に必要な対策を講じられます。
WhaTapは、10秒(既定値) 間隔で収集したThread Stackを使用して、メソッドレベルの性能遅延を分析します。
DynamicClass.lambda_method(System.Runtime.CompilerServices.Closure,System.Object,System.Object[])
demo450.Controllers.DelayTestController.Get(Int32)
System.Threading.Thread.Sleep(Int32)
System.Web.Http.ApiController.ExecuteAsync(System.Web.Http.Controllers.HttpControllerContext,System.Threading.CancellationToken)
System.Web.Http.Controllers.ActionFilterResult.ExecuteAsync(System.Threading.CancellationToken)
System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[[System.__Canon,mscorlib]].Start[[System.Web.Http.Controllers.ActionFilterResult+<ExecuteAsync>d__5,System.Web.Http]](<ExecuteAsync>d__5 ByRef)
System.Web.Http.Controllers.ActionFilterResult+<ExecuteAsync>d__5.MoveNext()
System.Web.Http.Controllers.ApiControllerActionInvoker.InvokeActionAsync(System.Web.Http.Controllers.HttpActionContext,System.Threading.CancellationToken)
System.Web.Http.Controllers.ApiControllerActionInvoker.InvokeActionAsyncCore(System.Web.Http.Controllers.HttpActionContext,System.Threading.CancellationToken)
...
例のスタックからトップラインはlambda_method
です。
DynamicClass.lambda_method(System.Runtime.CompilerServices.Closure,System.Object,System.Object[])
トップラインは、実行中のスレッドが該当メソッドを実行していることを意味します。途中でキャプチャされた可能性もありますが、確率的には各モジュールの処理時間の合計の比率でスタックに現れます。このトップラインメソッドの頻度を計算してメソッドレベルのパフォーマンスを判断できます。WhaTapは、トップラインの頻度統計をトップスタック(Top Stack)と呼びます。
トップスタック分析で現れたメソッドをどのメソッドが呼び出したかを頻度で分析できます。Stack Traceの各ステップで、ステップとステップの間で呼び出した比率をパーセンテージで分析した情報を提供します。最上位ステップから呼び出したステップの頻度をパーセンテージで計算し、降順に並べ替えた結果を表示します。
各ステップ項目の一番左にあるボタンを選択すると、そのステップを呼び出す上位ステップの呼び出し頻度をパーセンテージで提供します。
トップスタック統計は充分に多いデータで判断する必要があります。収集したスタックの数が10個未満の場合、統計的な意味を持つには不十分です。
トップスタックは、把握しづらい部分のチューニングポイントを見つけるのに役立ちます。呼び出し頻度が最も高いスタックは、アプリケーションサーバーで最も多くの応答遅延が発生していると判断できます。左に表示する比率は、アプリケーションサーバーのパフォーマンスへの影響度です。
安定したアプリケーションサーバーであっても、呼び出し頻度の高いスタックは性能の低下を引き起こす可能性があるため、そのクラスは注意深く見ることをお勧めします。
トップスタックをクリックすると、その最上位スタックに対する呼び出し頻度が確認できます。トップスタックの呼び出し関係は1対1なので、トップスタックのdepthが下がるほど情報の精度が低下する可能性があります。チューニング作業を行う際には、下位depthの情報は参照レベルで考えてください。
アプリケーションのパフォーマンス改善のため、最上位ステップへの呼び出し比率が高いモジュールのボトルネックを調べる必要があります。呼び出し比率が高いモジュールの場合、小さな性能改善でも、アプリケーション全体に大きな改善効果がある場合があります。
ダイアグラムで表示
複雑なスタックの呼び出しステップを簡単に理解できるため、ダイアグラムチャートを提供します。スタックテーブルの右上にあるダイアグラムで表示ボタンを選択すると、各ステップの呼び出し頻度と実行経路を一目で把握できます。
-
各ノードを選択すると、下位のdepthのスタックが表示されます。
-
マウススクロールで拡大/縮小したり、ドラッグで動かします。
-
スタックテーブルリストに戻るにはテーブルで表示ボタンを選択します。
注意事項
System.Threading.Thread.Sleep(Int32)
// System.Web.Http.ApiController.ExecuteAsyncの呼び出し比率は58.37%
System.Web.Http.ApiController.ExecuteAsync(System.Web.Http.Controllers.HttpControllerContext,System.Threading.CancellationToken)
// System.Web.Http.Controllers.ActionFilterResult.ExecuteAsyncの呼び出し比率は99.99%
System.Web.Http.Controllers.ActionFilterResult.ExecuteAsync(System.Threading.CancellationToken)
System.Threading.Thread.Sleep
← System.Web.Http.ApiController.ExecuteAsync
← System.Web.Http.Controllers.ActionFilterResult.ExecuteAsync
の呼び出し比率が58.37% * 99.99%を意味するものではありません。System.Web.Http.ApiController.ExecuteAsync
から他のモジュールを呼び出す可能性があるためです。
トップスタックで呼び出し比率を確認する際には、各ステップ間の呼び出し比率を合わせて、全体の呼び出し比率を判断してはいけません。トップスタックの呼び出し比率はStack Trace上に表示される情報からステップ間の呼び出し比率を算出した結果であるため、ステップ間の呼び出し比率から全体の呼び出し比率を算出すると、歪んだ計算結果になる恐れがあります。
ユニークスタック
ユニークスタックは、Stack Trace全体の正確な呼び出し情報に基づいて実行されたメソッドのセットが同じ場合の統計情報を提供します。
最もよく使われるスタックの情報が把握できます。同じスタックが何度も繰り替えても、重複を排除し、最も高い呼び出し頻度のスタックが確認できます。例えば呼び出す比率が高いStack Traceを識別できます。詳細な呼び出しステップのチェックにより、呼び出し経路上で異常モジュールの存在有無も把握できます。
各スタック項目では、メソッドの呼び出し経路(スタック)と当該メソッドの占める割合(パーセント)、全体の呼び出し件数(数)を表示します。各ステップ項目の左側にボタンを選択すると、その呼び出しスタックのメソッド名、ファイル名、ライン番号などの分析に役立つ情報を提供します。
フィルタリング
フィルター項目にメソッド名を入力して、照会結果をフィルタリングできます。文字列を入力した後、ボタンを選択します。
アクティブスタック
進行中のトランザクションをアクティブトランザクションと呼びます。アクティブトランザクションから定期的にダンプされたスタックをアクティブスタックと呼びます。
アクティブスタックでは、収集されたアクティブスタックを時系列チャートで確認できます。長時間実行されるメソッドと短時間で実行されるが、頻繁に実行されるメソッドの比率により、実行中のトランザクションの状態をリアルタイムで把握できます。
チャートは5分間の単位統計データを活用して、Active Transactionの数を棒グラフで、TPSを折れ線グラフで表示します。特定の時間帯の棒グラフをクリックすると、その時間帯のActive Transactionのリストを確認できます。
トランザクションリストの左側にあるボタンを選択すると、そのトランザクションのアクティブスタック情報を確認できます。
フィルタリング
フィルター項目にトランザクション名を入力して、照会結果をフィルタリングできます。文字列を入力した後、ボタンを選択します。
スタックの比較
トップスタックとユニークスタックでは、一定期間を基準にして、時間帯ごとでの比率の変化と収集件数に対する履歴情報を提供します。
時間選択に照会する時間を設定した上で比較するボタンを選択します。同じフィルター条件から1日以内期間での照会時にスタックを時間帯ごとで比較できます。この機能で、時間帯ごとでの呼び出しスタックの変化を把握し、性能のトレンドを確認できます。また、障害時点の状況把握や性能改善前後の比較などに有用なデータとして活用できます。
-
パーセント:照会期間中に選択されたスタックの比率の変化を確認できます。
-
数:収集されるスタックの数は、アクティブトランザクションの数に比例します。例えば、特定の区間で収集量が増加していれば、サービスの遅延や急激な流入量の増加があったと推測できます。
比較するボタンが活性化にならない場合は、照会できる時間範囲を超えたか、比較する時間帯のデータが不十分な場合です。時間選択で照会できる時間範囲に設定すると、比較するボタンが活性化されます。