インスタンスの性能管理
ホーム画面 > プロジェクト選択 > インスタンス性能管理
アプリケーションの環境を確認し、性能に関連する設定を確認できます。 エージェントおよびアプリケーションに関する詳細情報を確認できます。
-
右上のテキスト入力欄から希望する項目がフィルタリングできます。
-
モニタリング対象サーバーに位置するエージェントおよびアプリケーションの変更が自動的に反映されない場合は、リフレッシュボタンを選択します。
エージェントリスト
画面左側のアプリケーション一覧では、プロジェクトに割り当てられたエージェントの一覧を確認できます。 個々のエージェント項目を選択すると、右画面に、設定された環境変数、エージェント設定及びに性能に関する情報を照会できます。
エージェント一覧を更新するか、非活性化されたエージェントを再起動しても一覧に自動的に表示されない場合は、ボタンを選択します。
実行環境変数
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > 実行環境変数
エージェントの実行に関連する環境変数を照会できます。 環境変数のうち、重要な情報またはアプリケーションの状態情報をWhaTapサーバーに保存し、エージェントがダウンしても照会が可能です。 エージェントバージョンやインストールパス、名前、IPアドレスなどを確認できます。 CSVボタンをクリックすると、環境変数情報をダウンロードできます。 主な確認事項は次のとおりです。
-
(アプリケーション).version
: アプリケーションのバージョンを確認できます。 -
file.encoding
:utf-8
といったファイルエンコーディング形式を確認できます。 -
os.name
: OSを確認できます。 -
user.language
: ユーザー言語を確認できます。
-
-Xms
,-Xms
: ヒープメモリ設定に関連する環境変数を確認できます。 -
(アプリケーション).start
: アプリケーションの開始時間を確認できます。
環境変数
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > 環境変数
アプリケーションの実行に関連する環境変数情報を照会できます。 環境変数メニューは、照会時点の環境変数情報を収集して提供します。 System.getProperty()
を使用して、パラメータとして渡されたキーの値を照会します。 主な確認事項は次のとおりです。
-
(アプリケーション).version
: アプリケーションのバージョンを確認できます。 -
file.encoding
:utf-8
といったファイルエンコーディング形式を確認できます。
- アプリケーションステータス情報: 例えば
catalina.home
環境変数が照会される場合、tomcat環境であることが把握できます。
- OS環境変数: 例えば
(env) LANG
環境変数のように接尾辞(env)
形式で提供されます。
ヒープヒストグラム
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > ヒープヒストグラム
JVM(Java仮想マシン)のメモリにロードされているヒープ占有オブジェクトの状況(ヒープメモリ上のオブジェクト別サイズ)を照会することができます。 つまり、オブジェクトそのもののサイズを照会します。 数カラムを通じて主要オブジェクトの数を確認することが容易です。
GC前まで維持されるオブジェクトの数を照会するため、実際に使用されていなくても、該当一覧には表示されます。 正確な照会のためにシステムGC実行後にその一覧を確認することをお勧めします。 システムGCについては、次の文書を参照してください。
Java 6~8バージョンでは、JVMオプションなしで標準対応しますが、一部のJavaバージョンによっては次のようにJVMオプションを適用する必要があります。
-
Java 9 ~ Java 15バージョン
-Djdk.attach.allowAttachSelf=true
examplejava -javaagent:{WHATAP_HOME}/whatap.agent-X.Y.Z.jar -Djdk.attach.allowAttachSelf=true -jar {application.jar}
-
Java 16バージョン以降
-Djdk.attach.allowAttachSelf=true
--add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMEDexamplejava -javaagent:{WHATAP_HOME}/whatap.agent-X.Y.Z.jar -Djdk.attach.allowAttachSelf=true --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMED -jar {application.jar}
-
Java 5以前の旧バージョン、IBM Javaには対応していません。
ロード済クラス
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > ロード済クラス
Javaアプリケーションにロードされたクラス情報を確認できます。 ロード済クラスメニューを通じてアプリケーションでロードされたクラスリストと関連詳細データを照会し、中断なくクラスの動作を変更できます。
-
クラス詳細: 照会カラムでアイコンをクリックするとクラス詳細を確認できます。 クラス詳細は、クラス内のメソッド及び継承関係情報を提供します。
-
再定義: 再定義カラムでアイコンをクリックすると、そのクラスを再定義できます。 ランタイムに既にロードされたクラスを再びロードした後、バイトコード挿入(BCI)を通じてアプリケーションを中断することなく、該当クラスの動作変更が可能です。
-
リソース: そのクラスが物理的にどのファイルからロードされたかを確認できます。 アプリケーションの複雑な多階層構造の特性上、クラスが正確にどのjarファイルからロードされたかを把握するリソース情報の確認が必要です。
再定義機能とリソース情報確認活用の詳細は、次の文書を参照してください。
BCI(ByteCode Instrumentation)
Javaバイトコードは、プラットフォームに独立的な中間コードでJVMで実行されます。 BCIつまり、バイトコード挿入は、ソースファイルの修正なしでランタイムまたはビルドタイムにバイトコードを動的に変更して追加機能を実装する技術です。 詳細については、次の文書を参照してください。
ライブラリバージョン
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > ライブラリバージョン
Javaアプリケーションに配布されたコンポーネントのリストを照会できます。 オープンソースライブラリを多く使用する環境では、jarファイルのバージョン情報を確認し、互換性の問題を迅速に識別して解決できます。 また、バージョン情報の確認は、セキュリティの脆弱性があるバージョンを見つけてパッチするなど、セキュリティ管理にも容易です。
-
コンポーネント一覧情報: 当該jarファイルの名前及びバージョン情報を詳細で提供します。
-
CSV: ダウンロードボタンをクリックして、バージョン情報をダウンロードできます。
スレッドリスト/ダンプ
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > スレッドリスト/ダンプ
Javaプロセス内のすべてのスレッド状態のスナップショット情報を提供します。 スレッドリスト/ダンプはCPU最適化作業において重要なメニューです。 プロセスではなくスレッド単位で状態を確認することで、CPUリソースをより細かく管理できます。 例えば、照会時点でCPUを最も多く使用しているスレッドを特定した後、該当スレッドのスタック情報を確認して性能問題を識別できます。
-
スレッドステータス: 全体スレッド数およびRUNNABLE、WAITING状態のスレッド数を一覧の上段にある状況要約で確認できます。
-
スレッドダンプ: 上段右側の
スレッドダンプ
ボタンをクリックして、全体のスレッドダンプを作成できます。 スレッド全体のダンプを作成した後、スレッド一覧の下段でその情報を確認できます。 -
個別スレッドダンプ: 各スレッドごとにアイコンを選択すると、個々のスレッドダンプ情報を確認できます。 スタック及びスタックトレースで、スレッドの状態と実行パスに関する詳細及びスタックトレースを照会できます。 更新して確認できます。 詳細については次の文書を参照してください。
-
スレッドCPU時間: 該当スレッドがCPUを占有した累積時間を意味します。 ミリ秒単位の時間を使用します。
-
増加量: スレッドリストの上段で更新アイコンをクリックすると、既存のスレッドのCPU時間と現在のスレッドのCPU時間の差値が追加されます。
スレッドCPU時間は、当該スレッドがCPUを占有した総累積時間であるため、照会時点で最も多くCPUを使用しているスレッドを特定するためには増加量値の確認が必要です。 詳細については、次の文書を参照にしてください。
CPU使用量急増タイプ
-
ヒープメモリがいっぱいの場合: 頻繁なGCによりCPU使用量が急増
-
実際のリクエストが多い場合: 大量のクライアントリクエスト処理によりCPU使用量が急増
-
誤ったコードロジック: 非効率的なアルゴリズムや無限ループによりCPU使用量が急増
スレッドダンプ分析
スレッドリスト/ダンプメニューで確認できる個々のスレッドダンプ情報について案内します。
スレッド状態
スレッドの状態は、java.lang.Thread
クラス内にState
という名前のEnumerated Types(列挙型)と宣言された項目です。
-
NEW
:スレッドは作成されましたが、まだ実行されていません。 -
RUNNABLE
:現在CPUを占有し、作業を行っている状態です。 OSのリソース分配によりWAITING
状態になる可能性があります。 -
WAITING
:wait()
、join()
、park()
メソッドなどを利用して待機している状態です。 -
TIMED_WAITING
:sleep()
、wait()
、join()
、park()
メソッド等を用いて待機している状態、WAITING
状態と異なる点は、与えられた時間に待機している状態です。 外部的な変化だけでなく、時間によっても待機状態が解除されることがあります。 -
BLOCKED
:使用するオブジェクトのロック(Lock)が解除されるまで待機している状態です。 -
TERMINATED
:実行済みの状態です。
スレッドダンプ情報
スレッド一覧で各スレッドのボタンをクリックすると、個別スレッドダンプ情報を確認できます。
スタック
項目 | プロパティ | 説明 |
---|---|---|
スレッドID | threadId | スレッドに割り当てられた固有ID |
ロック所有者ID | lockOwnerId | スレッドがブロックされたオブジェクトのモニター(Monitor)のロックを維持するスレッドのID |
待ち件数 | waitedCount | スレッドがWAITING またはTIMED_WAITING 状態になった総回数 |
ブロック数 | blockedCount | スレッドがBLOCKED 状態になった総回数 |
待ち時間 | waitedTime | スレッドがWAITING 状態を継続した経過時間(ミリ秒)、スレッドの競合モニタリングが非活性化された場合は-1 を返す |
スレッドCPU時間 | threadCpuTime | スレッドのCPU時間合計(ナノ秒)をミリ秒で計算して表示、CPU時間測定を非活性化した場合は-1 を返す |
ステータス | threadstate | スレッド状態 |
ブロック時間 | blockedTime | スレッドがBLOCKED 状態になってからの経過時間(ミリ秒)、スレッドの競合モニタリングが非活性化された場合は-1 を返す |
スレッド名 | threadName | スレッドの固有名 |
ロック名 | lockName | スレッドの入力がブロックされたりObject.wait メソッドを介して通知を待つモニターロックを表示する文字列 |
ロック所有者名 | lockOwnerName | スレッドがブロックされるオブジェクトのモニターロックを受け入れるスレッド名 |
スレッドユーザー時間 | threadUserTime | スレッドがユーザーモードで実行したCPU時間(ナノ秒)をミリ秒で計算して表示 |
スレッド情報の詳細については次のリンクを参考にしてください。
スタックトレース
例外が発生した時のスタック(Stack) 追跡を表示します。 スタックフレーム一覧には、コードが呼び出したメソッド情報が含まれています。
ソケットオプーン数
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > ソケットオプーン数
JavaアプリケーションがTCP機能を実行するためにオープンしたソケット(Socket)情報が確認できます。これにより、アプリケーションインスタンスがデータベースなど、どの外部システムに依存するか、ネットワーク依存性(Network Dependency)を照会できます。 また、誰とアウトバウンドコールを行っているかを追跡できます。 これらの情報は、TCP通信の効率性、安定性、及び性能最適化のために重要です。
-
数: 外部システムへの接続試行回数を意味します。
-
スタック: スタック取得を選択して、次の接続時に確保したスタックを照会・削除できます。
数基準にソートした後、ホスト及びポートを確認して、どのようなサービスまたはシステムとの接続が多いかを確認できます。 以後、スタックを確保して詳細を照会してみてください。
データベースとコネクションプール
例えば、3306ポートの数が増加時に、コネクションプールを使用しなかったり、あるいはコネクションプールを頻繁に切って作り直すなど、MySQLのコネクション管理が正しく行われていない状況である可能性があります。 該当3306ポートがどのようなコード経路で使用されているかを把握するためスタックを確保して追跡できます。
メソッド性能状態
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > メソッド性能状態
Javaアプリケーションで実行されたメソッド(Method)の性能統計情報を提供します。
-
リフレッシュ: データを再呼び出しします。
-
リセット: 登録されたメソッド統計データを初期化します。
メソッド性能状態メニューを使うには、エージェント設定メニューから次のカスタムオプションを追加してください。 そして再起動またはロード済クラスメニューから再定義してください。
hook_method_stat_patterns=io.home.test.baseapp.app.post.mapper.PostMapperImpl.*
データソース状態
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > データソース状態
データソース(DataSource)の状態を確認できます。 アプリケーションが使用するデータベースコネクションプールの現在の状態と構成、接続設定情報、接続状態と設定の不一致などの情報を提供します。
コネクションプールオブジェクトの生成と同時にモニタリングが開始されるため、そのオブジェクトが使用されていなくても、データソースの状態情報に表示される可能性があります。
エージェントログ
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > エージェントログ
モニタリング対象サーバーに保存されているエージェントログを照会できます。 ログのファイル名は、whatap-YYYYMMDD
.log形式です。 各ログを選択して、ログに含まれてあるエラーやイベントに関する情報が確認できます。
ログに関連するエージェント設定は、次の文書を参照にしてください。
システムGC
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > システムGC
System.gc()
を呼び出してJVM(Java仮想マシン)のヒープ領域で動的に割り当てたメモリのうち、不要になったメモリオブジェクト(garbage)を集めて削除できます。 GC実行ボタンを選択するとGCプロセスが実行され、実行前後のメモリ容量を確認できます。
-XX:+DisableExplicitGC
のように明示的なGCリクエストを非活性化するオプションが設定されている場合、システムGCが動作しません。
システムGCとメモリリーク
Heapメモリ使用量が持続的に上昇した場合、メモリリークの可能性を確認し、正確に診断するためシステムGCが必要です。
-
メモリリクエスト有無: アプリケーションが継続的にメモリをリクエストしている状態であることを確認します。 メモリリクエストの増加が予想値以上であるか、またはメモリ解除が正確に行われているかを調べます。
-
メモリ使用量の確認: 実際にメモリが過剰に使用されているかを確認します。 GC実行により不要なオブジェクトを解除し、メモリ使用量の変化を調べます。
-
GC周期: メモリが十分に空いている状況でも、GCが実行されていない状態であるかを確認します。 GC周期または設定を調べます。
ヒープダンプ
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > ヒープダンプ
Javaアプリケーションの実行中にメモリ漏れなどの問題が発生すると、関連した問題を整理してダンプファイルを作成できます。 ヒープダンプ確保ボタンを選択します。 生成されたダンプファイルは、アプリケーションサーバーに保存されます。 エージェントをインストールしたパス下位のdumpディレクトリから確認できます。
この機能は、Javaエージェント1.5.2バージョン以降に対応しています。 エージェント設定でheapdump_enabled
オプションをtrue
に設定してください。 ヒープダンプ確保ボタンを選択して、ヒープダンプファイルを作成する機能を活性化します。 毎回ヒープダンプを自動作成するわけではなく、そのオプションが性能に影響を与えることはありません。 ただし、ダンプの確保作業は性能に影響を与える可能性があります。
ヒップダンプの確保作業は、負荷の大きい作業だと言えます。 負荷とは別に、ヒープダンプがすべて抽出されるまでアプリケーションのコードは実行中止(stop the world)になるため、ユーザーが感じる性能の差はさらに激しくなる可能性があります。
スロットル設定
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > スロットル設定
Javaアプリケーションの負荷量制御に関連するエージェント設定を確認し、オプションを設定できます。 負荷量制御に関するエージェント設定の詳細については、次の文書を参照にしてください。
エージェント設定Old
ホーム画面 > プロジェクト選択 > インスタンス性能管理 > エージェント設定 Old
モニタリング対象サーバーに位置するwhatap.confファイルを直接修正することなく、エージェント設定オプションを追加、変更、または削除できます。 設定ファイルのダウンロードボタンをクリックする時に選択したエージェントのwhatap.confファイルをダウンロードします。
エージェント設定機能は、使用性と機能を改善した管理 > エージェント設定メニューの利用をお勧めします。 画面右上の新しいエージェント設定ボタンを選択してください。 詳細については、次の文書を参照にしてください。