31.5. アプリケーションのチューニング

満足のいくアプリケーションパフォーマンスを得るには、 適切なアプリケーション設計と開発の実践が重要となります。 リモートサーバーのメモリ割り当てのタイムアウトやネットワーク問題などの要素によって、 アプリケーションによるデータの読み書きや処理がパフォーマンスボトルネックの原因となることがあります。 そのため、 パフォーマンスボトルネックの特定には、 各アプリケーションがどのように動作するかを理解することが重要となります。 各コード部分が要する予想時間を設定すると、 アプリケーションと比較する現実的なベンチマークの作成が容易になります。 平均はピーク時によって大きく異なることがあるため、ベンチマークには平均ではなくアプリケーションの高低ピーク使用時を考慮するようにします。
さらに、 ベンチマークツールを使用してアプリケーションをテストすると、 パフォーマンスボトルネックの原因となることが多いコードの問題を迅速に特定することが可能です。 起動などの要素によって発生するキャッシュやハードウェアの問題を特定するには、 反復テストを実行するとよいでしょう。
JBoss Enterprise Application Platform の Web コンソール http://localhost:8080/web-console/ は、 デフォルトページの JVM ハードウェア環境統計で始まる監視ツールを提供し、 監視ツールやスナップショットへのアクセスを提供します。 

注記

パフォーマンスモニターは、 1 秒毎の要求など全体的なアプリケーションパフォーマンスについて情報を提供します。 JBoss Profilerなどのプロファイリングツールを使用すると、 アプリケーションが要求への対応に要する時間や特定タイプの要求に対応する頻度などを調べることができます。 例えば、 メソッドが呼び出された回数や、 メソッドで費した平均/最大/最短時間など、 通常は個別のメソッドまで分類することができます。
また、アプリケーションのパフォーマンス問題を修正する時に他のアプリケーションのボトルネックを作らないよう注意することが重要となります。

31.5.1. インストルメンテーション

パフォーマンス分析にはアプリケーションをインストルメント化する必要があります。 ほとんどの場合で、 実際の実稼働ワークロードは予想したワークロードと異なるはずです。 アプリケーションをインストルメント化しないと、 データを明確に追跡することができません。 企業規模やビジネスモデル、 ビジネス環境は変動するため、 アプリケーションのワークロードは時間と共に変更します。
以前は、 インストルメント化がアプリケーションに組み込まれていなければなりませんでした。 現在では、 開発者がコーディングする必要がないインストルメント化の方法が多く存在します。 インストルメント化に市販の製品や JBoss AOP フレームワークを使用することができます。 コンテナーの呼び出し統計を有効にすることも、 統計のハイバネートも可能です。 詳細は、 AOP と Hibernate のプロジェクトページを参照してください。
連続的に取得したスレッドダンプ (各 Java Enterprise Application Platform スレッドの現在のコールスタックを含む) には、 アプリケーションで何が起こっているかを開発者が予想できる十分な情報が含まれています。 アプリケーションがパフォーマンスの限界に達したら、 スレッドダンプを取得するのが 1 つの手段です。 パフォーマンスの問題が 5 分間継続する場合、 スレッドダンプを毎分生成してみます。 JVM の 「jps -l」コマンドを使用して実行している Java アプリケーションとそのプロセス ID のリストを表示することもできます。 この場合、 「org.jboss.Main」アプリケーションのプロセス ID を確認し、 「jstack ProcessID」 コマンド (ProcessID は「org.jboss.Main」 のプロセス ID に置き換え) を実行し、 スレッドダンプを生成します。 jstack コマンドの出力を転送し、 出力を保存するようにしてください ("jstack ProcessID > threaddump1.txt")。