Reading Time: 1 minutes
Javaは、その登場以来、高い使用率と人気を誇っています。プラットフォームに依存しない仕様により、あらゆる企業・業界・現場のアプリケーションに採用されるようになりました。
Javaで業務上重要なアプリケーションを開発・実行している場合、Javaアプリケーションのパフォーマンスに注意を向けることが重要です。
Javaアプリケーションは便利ではあるものの、チューニングやメンテナンスを怠ると、時に処理速度が遅くなったり、最悪の場合は停止してしまったりする可能性があります。
そのような事態を防ぐために、アプリケーションの開発者や運用管理者は、Javaアプリのパフォーマンスを監視し、異変を察知してアプリケーションの動作に影響が出る前にチューニングする必要があります。
ここでは、Javaアプリケーションのパフォーマンスで見るべき箇所をご紹介します。
また、最後にはJavaアプリのパフォーマンス監視を、誰でも簡単に実現する方法もご紹介しますので、ぜひ最後までご覧ください。
1:リクエストスループット
リクエストスループットとは、ある時間あたりのリクエスト処理量です。
Javaアプリケーションは、さまざまなユーザーからの操作を処理するため、複数のリクエストを同時に実行します。リクエストのスループットを監視することで、アプリケーションのリクエスト負荷を確認することが可能になります。
リクエストスループットを監視すると、スループットが大きい日にち・曜日・時間帯などを特定できます。アプリケーションの使用ピーク時間を特定し、それに応じてサーバーを最適化しましょう。
2:トランザクション
トランザクションとは、複数のアクションを一連の流れで実行するものです。アプリケーションのリクエストは、さまざまなトランザクションの集合体です。
トランザクションを監視すると、リクエスト処理の非効率な箇所を発見できるかもしれません。
特に、トランザクションの以下の項目を監視することがおすすめです。
平均応答時間
トランザクションの平均応答時間は、特定のトランザクションが完了するまでに要した平均時間です。平均応答時間が長くなると、アプリケーションの遅延の原因となり、アプリケーションユーザーの不満の原因となる可能性があります。
コンポーネント別の応答時間
さまざまなコンポーネントの応答時間を把握することで、アプリケーションの遅延の根本原因を突き止め、応答時間の長いコンポーネントのコード再構築やクエリのチューニングができるようになります。
3:データベース
大抵のJavaアプリケーションは、データベースと通信し、クエリを通じてデータを取得し、ユーザーのリクエストに対応します。
データの取得に遅延があると、アプリケーションのパフォーマンスが低下する可能性があります。そのため、アプリケーションのデータベースクエリを監視することが重要です。
データベースクエリの応答時間、操作スループット、および操作回数を監視することが理想的です。
4:JVM
Java仮想マシン(JVM)は、特定の機種やOSに依存せずにプログラムを稼働させるための重要な仕組みです。
JVMは通常、ヒープメモリと非ヒープメモリの2つの異なるセグメントに分けられます。実際のオブジェクトはヒープメモリに格納され、読み込まれたされたオブジェクトとメタデータが非ヒープメモリに格納されます。
JVMを監視することで、潜在的なメモリリークを発見し、問題が発生する前にチューニングできるかもしれません。JVMで監視すべき項目は以下の通りです。
メモリ
Eden領域・Survivor領域・Tenured領域などの重要なヒープメモリコンポーネントと、コードキャッシュ領域・Compressed Class Space領域・MetaSpace領域などの非ヒープメモリコンポーネントを監視しましょう。
上記は、JVMのメモリをより効率的に構成するための指標です。これらのメトリクスの使用値が高い場合は、ガベージコレクション(GC)が発生する可能性があることを示しています。
また、GCを分析することも非常に重要です。各サイクルに費やされた時間や収集されたオブジェクトなど、メジャーとマイナーの両方のガベージコレクションサイクルを確認しましょう。最大数のオブジェクトがいつ収集され、どれくらいの時間がかかったかを理解することで、GCの頻度を知り、それに応じてヒープメモリサイズを構成できます。
スレッドメトリクス
Javaアプリケーションのリクエストは複数のスレッドに分割され、同時実行が可能になっています。スレッドは、レイテンシを減らし、アプリケーションの応答性を向上させることで、アプリケーションが受信したリクエストに迅速に対応できるようになっています。
スレッドについて監視すべき項目は以下の通りです。
- デーモンスレッド
バックグラウンドで実行され、プログラムの実行が終了するまでJVMが終了しないようにするスレッドです。 - ライブスレッド
現在アクティブになっているスレッドです。 - ピークスレッド
JVMで実行されるスレッドの最大数です。
これらの指標を分析することで、CPU使用率の増加や他のリソースを浪費している可能性があるスレッドを特定できます。実行中のスレッド数を確認することで、スレッドプールが最大使用量に達する前にそれを阻止できる可能性が高まります。また、アイドル状態のスレッドを特定して排除することで、リクエストの拒否を防ぐこともできます。
5:エラーと例外
エラーと例外をトレースすることで、アプリケーションをより最適化できます。エラーを解決することで、アプリケーションのユーザー満足度を向上できます。
6:Apdexスコア
Application Performance Index (Apdex) は、アプリケーションの応答時間に関するユーザー満足度を測定するのに役立つ世界共通の基準です。これは0と1の間で表されます(0 = すべてのユーザーが不満、1 = すべてのユーザーが満足)。
Apdexスコアを算出するには、アプリケーションが快適に利用できる応答時間のしきい値Tを決め、それに従ってアプリケーションの処理の満足度を記録し、算出します。
- 満足(satisfied):応答時間がT秒以下
- 容認(tolerating):応答時間がT秒を超え、4T以下
- 不満(frustrated):許容不能を示す4Tを超えている状態
Apdexスコアは以下の式で算出されます。
Javaアプリのパフォーマンスを簡単に可視化するには?
ManageEngineが提供するAPMツールApplications Managerは、Javaアプリケーションのパフォーマンスを監視できるツールです。
これまでにご紹介したJavaアプリケーションのパフォーマンスの重要項目を、難しい設定や開発不要で、これまでご紹介した画像のようにわかりやすく可視化します。簡単操作で時間がかかっているプログラムをコンポーネント単位で特定したり、遅い処理が読み込まれたURLなどを一覧表示したりすることが可能です。
Javaアプリケーションのパフォーマンス調査やチューニングまでの作業を効率化するには、ぜひManageEngineのApplications Managerをご検討ください。
Javaアプリケーションのパフォーマンスを簡単に可視化するApplications Managerの「APMインサイト」機能のご紹介はこちら
フィードバックフォーム
当サイトで検証してほしいこと、記事にしてほしい題材などありましたら、以下のフィードバックフォームよりお気軽にお知らせください。