本記事は2005年に執筆されたものです。Javaチューニング全般の最新情報は@IT キーワードINDEXの「Javaパフォーマンス管理」をご参照ください。
この連載では、Javaアプリケーションのパフォーマンスチューニングについて、さまざまなテクニックやツールの使い方を紹介していきます。連載の第1回では、パフォーマンスチューニングにおける基本的ルールや、HPが提供する各種のJavaパフォーマンス・ツールの使い方を説明します。なお、今後の連載では、JVMレベルにとどまらず、OSのカーネル・パラメータやネットワーク・パラメータのレベルでのチューニング方法も解説します。また、より高度なチューニング技法として、JVMのガベージ・コレクションやスレッド競合に注目する方法も紹介する予定です。
連載予定
第1回 Javaパフォーマンスチューニングのルール
第2回 Javaのガベージ・コレクション
第3回 Javaにおけるヒープ・メモリ管理
第4回 Javaにおけるマルチスレッドによるリソース競合
第5回 Javaにおけるメモリ・リークの発見
第6回 メモリ・リーク解析とHotSpot JVM
パフォーマンスチューニングのルール
パフォーマンスチューニングにはいくつかの「基本ルール」があります。これらのルールは、どのようなシステムに対しても適用できる一般的なものといえるでしょう。パフォーマンスチューニングについて技術的な詳細を論じる前に、まずはこれらのルールを紹介します。
ルール1:システムのパフォーマンスは、互いに依存し合う多数の要因によって決まる
1つのシステムの内部では、数多くのコンポーネントが協調して動作しており、互いに複雑に依存し合っています。そのため、どの部分がパフォーマンスのボトルネックなのかを一目見ただけで特定するのは、極めて難しいことです。例えば、「Webサイトのレスポンスが遅い」と一言にいっても、Webサーバの設定内容やサーバ・アプリケーションの設計、データベースやネットワークの過負荷など、さまざまな原因が考えられます。
また、次のルールも、こうした複雑な依存関係から生じるものです。
ルール2:パフォーマンスチューニングは、常にトレード・オフを伴う
システムのパフォーマンスチューニングには、OSの動作メカニズムをはじめ、パフォーマンスに影響を与える依存関係の理解が必要です。ある部分にチューニングを施せば、ほかの部分で性能の劣化を招く可能性もあるのです。例えば、メモリ利用率を向上させるためのチューニングによって、ファイル・システムのパフォーマンスが低下するようなケースも考えられます。よって、アプリケーションに求められる機能や能力、そしてメモリとファイル・システムの相互作用を理解し、トレード・オフの最適なポイントを見極めることが重要となります。
また、ボトルネックが存在する場合には、システムに備わるさまざまなリソース(CPUやメモリ、HDD、ネットワーク帯域など)と、それに対する要求のバランスを上手に維持しなくてはなりません。ボトルネックを解消するためには、リソースを増加させるか、あるいは要求を減らすかのいずれかしかありません。そこで、システム内部のリソース消費の状況を詳しく観察することが大きな意味を持ちます。
さらに、システムの挙動を観察するうえでは、次のルールが役に立つでしょう。
ルール3:システムに影響を与えずにシステムを観察することは不可能である
パフォーマンスの計測は、それ自体がシステムのリソースを消費する行為でもあります。例えば、GUIベースの計測ツールを起動すれば、数MBものメモリを消費するでしょう。また、こうしたツールはリソースを消費するだけでなく、システムの挙動そのものをも変えてしまうことに注意してください。メモリが不足しているシステムでは、ツールによるメモリ消費によってOSのスラッシング(過度なページング)が発生するかもしれません。こうなると、システムをありのままの姿で観察することはもはや不可能です。
計測ツールを選択するうえでは、「どの程度までならシステムに与える影響を許容できるのか」がポイントとなります。状況に応じてさまざまなツールを使い分けることが必要です。例として、GUIベースのツールの代わりに、リソース消費の少ないテキストベースのツールを利用する、といった選択が考えられます。
ルール4:チューニングに必要なすべてのデータを提供できる万能ツールは存在しない
あらゆる情報を網羅して収集できる完ぺきなツールは存在しません。よって、パフォーマンスチューニングでは、複数のツールの使い方を習得せざるを得ないのです。また、複数のツールを使用することで、計測結果を相互にチェックでき、各ツールが本当に正しい情報を提供しているかを裏付けできます。
例えば、JVM(Java仮想マシン)内部の挙動を把握するには、「プロファイリング」と呼ばれるログ機能を利用します。そこで、プロファイリングと並行して、OSのリソース消費状況を計測するツールを利用するのも1つの方法です。この方法であれば、JVM内部の動作がOSにどのような影響を与えているのかを、より正確に把握できます。
チューニングの手順
パフォーマンスの問題を速やかに解決しなくてはならない状況では、計測や分析に時間をかけず、推測に基づく安易な対応を取ってしまいがちです。しかし大抵の場合、こうした対応は状況をさらに悪化させかねません。場当たり的な対応をする代わりに、以下に示す一定の手順に従ってパフォーマンスチューニングを実施することが望ましいでしょう。
- 調査(Assess)
- 測定(Measurement)
- 分析(Analyze)
- 特定(Identify)と調整(Tune)
図1は、この手順を図示したものです。
同図が示すように、パフォーマンスチューニングは、まず「調査」の作業から始めます。具体的には、チューニング対象となるシステムの構成やアプリケーションの設計、パフォーマンスの目標値などを調べます。これにより、「何をどこまでチューニングするのか」といった基本的な前提条件をあぶり出しておきます。続いて「測定」を行い、実際のシステムを動作させながらアプリケーションのパフォーマンスを測定します。その後、測定結果に対して「分析」を施し、「特定と調整」の作業により実際のチューニングを実施します。これら一連の作業を、パフォーマンスの目標値が達成されるまで繰り返します。
パフォーマンスの目標値が達成されれば、チューニング作業は完了です。一方、チューニングを終えた後でも、システムに掛かる負荷の状況が変化した場合は、作業をもう1度やり直す必要もあるでしょう。
それでは、個々の作業について、もう少し詳しく説明していきます。
Copyright © ITmedia, Inc. All Rights Reserved.