スレッドプロファイリングは、CPU 時間とタイプ別のスレッド数に関するスレッドレベルの統計情報を提供します。5 分ごとにスレッドのメソッドスタックを記録して集計し、実際のコード実行を再構築することで、スレッド関連の問題を迅速に特定できます。クラスターで CPU 使用率が高い場合や、処理が遅いメソッドが多数存在する場合は、スレッドプロファイリングを使用して、CPU を最も消費しているスレッドまたはメソッドを見つけることができます。
この機能は、現在 Java アプリケーションでのみ利用可能です。
前提条件
ARMS アプリケーションモニタリングは、新しい料金プランをご利用のユーザー向けに、新しいモニタリング詳細ページを提供しています。新しい料金プランの詳細については、「料金 (新規)」をご参照ください。
新しい料金プランを有効にしていない場合は、[Application List] ページで [新バージョンに切り替え] をクリックしてください。
アプリケーションにはエージェントをインストールしておく必要があります。詳細については、「アプリケーションモニタリング統合の概要」をご参照ください。
操作手順
-
ARMS コンソール にログインします。左側のナビゲーションペインで、 を選択します。
-
アプリケーションリスト ページの上部で目的のリージョンを選択し、アプリケーション名をクリックします。
説明言語 列のアイコンには、次の意味があります。
:アプリケーションモニタリングと連携した Java アプリケーション。
:アプリケーションモニタリングと連携した Go アプリケーション。
:アプリケーションモニタリングと連携した Python アプリケーション。[-]:Managed Service for OpenTelemetry と連携したアプリケーション。
-
上部メニューで、 を選択します。
スレッドの分析
スレッド分析 ページの左側のリストには、すべてのアプリケーションスレッドが表示され、[CPU 時間] をもとに異常なスレッドをすばやく見つけることができます。異常なスレッドを選択したら、右側のグラフを使用して、その [CPU 時間]と スレッド数 を分析します。たとえば、1 分あたりのスレッド総数が過剰でないかを確認できます。
異常なスレッドについては、メソッドスタック をクリックして、指定した期間のランタイムメソッドスタックを表示できます。たとえば、BLOCKED 状態のスレッドに対応するメソッドを表示できます。これにより、最適化が必要な特定のコードセグメントを特定し、CPU 使用率を削減できます。
ALL: 365194 RUNNABLE: 986 BLOCKED: 87 WAITING: 1498 TIMED_WAITING: 362617
【BLOCKED】81/87(次) - 占比 93.10%
at java.lang.Object.wait (Native Method)
at xxx.awaitAvailable (BasicResourcePool.java:1315)
at xxx.prelimCheckoutResource (BasicResourcePool.java:557)
at xxx.checkoutResource (BasicResourcePool.java:477)
at xxx.checkoutPooledConnection (C3P0PooledConnectionPool.java:525)
at xxx.getConnection (AbstractPoolBackedDataSource.java:128)
at xxx.getConnection (PoolingConnectionProvider.java:247)
at xxx.getConnection (DBConnectionManager.java:108)
at xxx.getConnection (JobStoreSupport.java:775)
at com.alibaba.arms.alert.scheduler.xxx.EnhanceJobStoreSupport.getNonManagedTXConnection (EnhanceJobStoreSupport.java:17)
at xxx.executeInNonManagedTXLock (JobStoreSupport.java:3777)
at xxx.retryExecuteInNonManagedTXLock (JobStoreSupport.java:3742)
at xxx.triggeredJobComplete (JobStoreSupport.java:3039)
at xxx.notifyJobStoreJobComplete (QuartzScheduler.java:1804)
at xxx.JobRunShell.java:269)
at xxx$WorkerThread.run (SimpleThreadPool.java:573)
【BLOCKED】2/87(次) - 占比 2.30%
at xxx.checkinStatement (GooGooStatementCache.java:220)
at xxx.checkinStatement (NewPooledConnection.java:239)
at xxx.close (NewProxyPreparedStatement.java:1807)
at xxx.closeStatement (StdJDBCDelegate.java:3287)
at xxx.deleteFiredTrigger (StdJDBCDelegate.java:2916)
at xxx.triggeredJobComplete (JobStoreSupport.java:3116)
at xxx.executeVoid (JobStoreSupport.java:3043)
at xxx.$VoidTransactionCallback.execute (JobStoreSupport.java:3703)
at xxx.$VoidTransactionCallback.execute (JobStoreSupport.java:3701)
at xxx.executeInNonManagedTXLock (JobStoreSupport.java:3787)
at xxx.retryExecuteInNonManagedTXLock (JobStoreSupport.java:3742)
at xxx.triggeredJobComplete (JobStoreSupport.java:3039)
at xxx.notifyJobStoreJobComplete (QuartzScheduler.java:1804)
at xxx.JobRunShell.java:269)
at xxx.WorkerThread.run (SimpleThreadPool.java:573)
【BLOCKED】1/87(次) - 占比 1.15%
エージェントのバージョンが 2.7.3.5 以降の場合、ARMS は継続的なプロファイリングを使用して、スレッドの CPU 使用状況について、より正確なメソッドスタック情報を提供します。次の図に例を示します。詳細については、「継続的なプロファイリング」をご参照ください。

メソッドスタック をクリックした後にデータが表示されない場合は、次の手順でトラブルシューティングしてください。
-
エージェントのバージョンが 2.7.3.5 より前の場合は、 タブの [スレッド設定] セクションで、[スレッドプロファイリングのメソッドスタック] スイッチが有効になっているかを確認してください。このスイッチが無効になっている場合、メソッドスタック情報は記録されません。有効になっている場合は、5 分ごとにメソッドスタック情報が収集されます。
-
エージェントのバージョンが 2.7.3.5 以降の場合は、 タブの [継続的なプロファイリング] セクションで、メインスイッチ と CPU ホットスポット スイッチの両方が有効になっていることを確認してください。メソッドスタック情報を記録するには、両方のスイッチを有効にする必要があります。