サーバーモニタを使用したサーバーのパフォーマンスの向上

サーバーモニタは、ColdFusion サーバーのパフォーマンスの向上に役立つ情報を提供します。

開発中のアプリケーションのボトルネックの発見

  1. 監視、プロファイリング、およびメモリトラッキングを有効にします。

  2. 低速なリクエストおよびメモリ使用量の多いリクエストのレポートのしきい値をゼロ (0) に設定します。

  3. テンプレートを実行します。

  4. それぞれのリクエストに対して、次のものを見つけます。

    • 低速なリクエストのレポートで、低速なタグと関数。

    • メモリ使用量の多いリクエストのレポートで、最大の変数。

JVM メモリ使用量

ColdFusion はエンタープライズ Java アプリケーションなので、パフォーマンスに最も影響するソフトウェアコンポーネントは JVM (Java Virtual Machine: Java 仮想マシン) です。異なるベンダの JVM や、同じベンダでもバージョンの異なる JVM は、パフォーマンスについて異なる特性を持っています。ColdFusion とともに使用している JVM を変更することで、パフォーマンスを向上できる可能性があります。

ColdFusion には、アプリケーションサーバーとしての Tomcat の組み込みバージョンと、Sun の JVM バージョン 1.6 が含まれています。 一方、IBM WebSphere Application Server 上で動作する J2EE 用 ColdFusion は、WebSphere に設定されている JVM を使用します。

異なる JVM を使用するように ColdFusion を設定するには、<ColdFusion のルートディレクトリ>/runtime/lib/jvm.config ファイルをテキストエディタで編集して、java.home の値を、使用する JVM のルートディレクトリを指すように変更します。または、ColdFusion Administrator の [Java と JVM の設定] ページで JVM を変更することもできます。

JVM を切り替えるとソフトウェアの環境が大幅に変更されるため、最初に開発環境またはテスト環境で切り替えてください。また、本番サーバーに変更を加える前に、ColdFusion アプリケーションを十分にテストしてください。

JVM はメモリ管理を行っているため、JVM の設定方法によってパフォーマンスに大きな影響が出ることがあります。JVM の最も重要な設定は、初期ヒープサイズと最大ヒープサイズです。初期ヒープサイズは JVM が開始時に使用するメモリ量を表し、最大ヒープサイズは JVM が使用できるメモリ量を表します。これらの設定は、ColdFusion Administrator の [Java と JVM の設定] ページで変更できます。[初期メモリサイズ] の設定に初期ヒープサイズを指定し、[最大メモリサイズ] の設定に最大ヒープサイズを指定します。初期ヒープサイズと最大ヒープサイズを指定する JVM 引数は、それぞれ -XmsNm および -XmxNm です。ここで、N にはメガバイト (MB) 単位のヒープサイズを指定します。これらの JVM 引数は、jvm.config ファイル内の java.args 設定の値として保存されます。

デフォルトの最大ヒープサイズは、ColdFusion では 512 MB に設定されています。最高のパフォーマンスを得るには、初期ヒープサイズと最大ヒープサイズを同じ値に設定します。ColdFusion サーバー上でアプリケーションを実行する上で最適なヒープサイズを判断することで、パフォーマンスが向上します。大きすぎる値を設定すると、ガベージコレクションの頻度が高くなり、ヒープが大きいことで必要になる内部メモリ管理が発生してパフォーマンスが低下します。逆に、ヒープサイズに小さすぎる値を設定すると、使用可能であるよりも多いメモリをアプリケーションが使用したときに java.lang.OutOfMemoryError エラーが発生します。

最適なヒープサイズを最も効果的に判断するには、大きなヒープを割り当てておき、ピーク負荷をシミュレーションした状態でアプリケーションを実行して、アプリケーションが実際に使用するメモリ量を監視します。たとえば、アプリケーションが実際には 180 MB のメモリしか使用していなければ、ヒープサイズを 256 MB に減らすとパフォーマンスが向上する可能性があります。

java.lang.OutOfMemoryError エラーは、その他のより複雑な条件で発生することがあります。このエラーが発生するよくある原因に、オブジェクトがヒープの Permanent 世代領域を使い切ってしまうことがあります。この領域のデフォルトのサイズは 64 MB です。ColdFusion Administrator の [Java と JVM 設定] ページに次の JVM 引数を追加することで、このサイズを増やすことができます。次の例では 128 MB に増やしています。

-XX:MaxPermSize=128m.

ハードウェアの物理メモリは、最適なヒープサイズを判断する上で重要です。最大ヒープサイズを、物理メモリの空き容量より大きく設定すると、パフォーマンスに深刻な悪影響が出ます。たとえば、物理メモリが 512 MB しかない場合、最大ヒープサイズを 512 MB に設定しないでください。オペレーティングシステムや他の実行中のアプリケーションもメモリを使用するため、JVM プロセスが使用できるメモリは 512 MB よりも大幅に少なくなります。これは、ソフトウェアアプリケーションの必要条件に合ったハードウェアを導入することの重要性を示しています。最高の結果を得るために、1 GB 以上の物理メモリを搭載したサーバーハードウェアで実行してください。

サーバーモニタの [要約] ページは、JVM のメモリ使用量を監視します。最適なヒープサイズを判断する際に、この情報を使用します。

変数のメモリ使用量

クライアント変数を使用する際は、Cookie や RDBMS 使用時のパフォーマンスが最高になるようにクライアント変数ストレージを設定してください。この値は、ColdFusion Administrator の [クライアント変数] ページで設定します。

可能であれば、特に isdefined() 関数を使用する際は、変数名を完全なスコープで指定することをお勧めします。たとえば、<cfif isdefined("variables.myvariable")><cfif isdefined("myvariable")> よりもかなりパフォーマンスが向上します。

変数によるメモリ使用量を監視するには、サーバーモニタのメモリ使用量のレポートを表示します。

リクエストの処理

ColdFusion Administrator の [設定] ページにある [同時リクエスト] の設定は、負荷がかかった状態でのアプリケーションのパフォーマンスに最も大きく影響します。この設定は、受信リクエストを同時に処理する際に使用するスレッド数を決定します。ほとんどのアプリケーションにとって、最初は 1 つのプロセッサにつき 3 を設定するのが最適です。デュアルプロセッサコンピュータを使用している場合は、同時リクエストの制限を 6 に設定します。この設定の最適値を判断するには、アプリケーションに負荷をかけてさまざまな値でテストして、負荷をかけた状態で最もパフォーマンスが良い値を見つけます。アプリケーションをテストしている間、平均応答時間をサーバーモニタの [要約] ページに、レポートを統計情報に表示できます。

キャッシュ

本番アプリケーションで ColdFusion Administrator の [キャッシュ機能] ページにある [信頼できるキャッシュ] の設定を有効にすると、CFML ソースコードが最後にコンパイルされたときから変更されたかどうかを見るためにサーバーがファイルシステムを確認しないようになります。この設定によって、パフォーマンスに大きく影響するシステム I/O を最小化できます。ColdFusion Administrator の [キャッシュ機能] ページにある [テンプレートキャッシュサイズ] は、通常使用する ColdFusion テンプレートの数にほぼ等しくなるように設定してください。設定がパフォーマンスに影響する度合いを監視するには、サーバーモニタの [リクエストの統計情報] セクションにあるテンプレートキャッシュのステータスを使用します。

さらに、アプリケーションでは可能な限り次のいずれかの方法でキャッシュを使用してください。

  • cfcache タグ

  • データベースクエリーのキャッシング。データベースキャッシングはパフォーマンスと拡張性を大幅に向上させます。キャッシングを実行するには、cfquery タグなどのデータベースタグの cachedwithin 属性と cachedafter 属性を使用します。

  • データをセッションスコープなどのパーシスタントスコープに格納して、1 回のリクエストよりも長い間使用可能にする方法。

データベース応答時間

データ操作は、可能な限りデータベースサーバーに実行させることをお勧めします。データ操作を行う SQL コードを追加するほうが、文字列操作やメモリ内クエリー (クエリーオブクエリー) よりもはるかに効率的です。さらに、ストアドプロシージャを使用すると、通常の SQL クエリーよりも一般的にパフォーマンスが向上します。通常、cfquery 呼び出しのクエリーをストアドプロシージャに変換して cfstoredproc タグを使用すると、パフォーマンスが向上します。データベース応答時間の情報を表示するには、サーバーモニタの [データベース] セクションを使用します (データベースを参照してください)。