パフォーマンス向上のためのデザインと構成

更新 : 2007 年 11 月

このトピックでは、Web アプリケーションのパフォーマンスを向上するために使用できる、デザイン、構成、コンパイル、およびメモリに関するオプションについて説明します。

非同期プログラミング モデル

ASP.NET は非同期プログラミング技術をサポートしており、これを使用することで、データベース クエリなどの長時間実行されるタスクを、メイン アプリケーション スレッドとは別個に実行されるスレッドに移すことができます。使用できる技術は次のとおりです。

  • BackgroundWorkerコンポーネント   System.ComponentModel 名前空間の BackgroundWorker クラスを使用すると、時間のかかるタスクのコードを DoWork イベント ハンドラに追加し、RunWorkerAsync メソッドを呼び出して DoWork イベントを発生させることができます。呼び出し元スレッドが動作し続けると共に、ワーカー メソッドも非同期的に動作します。このメソッドが完了すると、BackgroundWorker コンポーネントは RunWorkerCompleted イベントを発生させて、呼び出し元スレッドに対して警告します。詳細については、「BackgroundWorker コンポーネント」を参照してください。

  • イベント ベースの非同期プログラミング   イベント ベースの非同期パターンには、個々のクラスでサポートされている操作の複雑さに応じて、複数の形式があります。最もシンプルなクラスには、単一の MethodNameAsync メソッドと対応する MethodNameCompleted イベントが含まれます。より複雑なクラスには、複数の MethodNameAsync メソッドと、それぞれに対応する MethodNameCompleted イベント、これらのメソッドの同期バージョンが含まれます。クラスでは、キャンセル、進行状況のレポート、および各非同期メソッドのインクリメンタル結果をオプションでサポートできます。

    また、非同期メソッドでは複数の保留中の呼び出し (複数の同時呼び出し) をサポートして、他の保留中の操作が完了するまで、コードを何度も呼び出すことができます。このような状況を適切に処理するには、アプリケーションで各操作の完了を追跡する必要があります。

    パターンとその実装の詳細については、「イベントベースの非同期パターンの概要」を参照してください。

  • IAsyncResult を使用する非同期プログラミング   IAsyncResult デザイン パターンを使用する非同期操作は、それぞれ非同期の OperationName を開始および終了する BeginOperationName と EndOperationName という 2 つのメソッドとして実装します。BeginOperationName は、呼び出し元スレッドに即座に制御を戻します。EndOperationName メソッドは、非同期操作 OperationName を終了します。EndOperationName を呼び出すタイミングは重要です。これにより、OperationName が完了していない場合に呼び出し元スレッドがブロックされるからです。詳細については、「非同期プログラミングの概要」を参照してください。

  • Clients callbacks   クライアント コールバックでは、クライアント スクリプト関数は要求を ASP.NET Web ページに送信します。このとき、ポストバックのオーバーヘッドはありません。

これらの技術の使用例については、「イベントベースの非同期パターンの技術サンプル」を参照してください。

コンパイルと構成のオプション

アプリケーションをどのようにコンパイルし構成するかによって、パフォーマンスが大きく影響されます。次のガイドラインでは、Web アプリケーションの全体的な効率化を図るための推奨方法を示します。

  • 大規模な Web アプリケーションは、プリコンパイルします。

  • Internet Information Services 5.0 上で ASP.NET Web アプリケーションを実行している場合は、プロセスをリサイクルしてください。

  • 必要に応じて、アプリケーションのワーカー プロセスごとにスレッド数を調整します。外部リソースへの依存度が高いアプリケーションの場合は、マルチプロセッサ コンピュータに対して Web ガーデンを有効化することを考慮します。

  • デバッグ モードを無効にします。

  • 必要に応じて、Web サーバー コンピュータや特定のアプリケーションの構成ファイルを次の技術を使用して調整します。

    • 認証を必要とするアプリケーションについてだけ認証を有効にします。

    • アプリケーションの要求エンコーディングと応答エンコーディングを適切に設定します。

    • アプリケーションの AutoEventWireup を無効にすることを検討します。

    • 使用されていないモジュールを要求処理のパイプラインから削除します。

詳細については、「パフォーマンスの概要」を参照してください。

キャッシュ構成のオプション

アプリケーションのパフォーマンスを向上するために、キャッシュを次のレベルで構成できます。

  • アプリケーション   アプリケーションの Web.config ファイルで、OutputCacheSection 要素を使用して、アプリケーション全体のキャッシュを制御できます。OutputCacheSettingsSection 要素を使用すると、キャッシュ プロファイルをセットアップして、個々のページに適用できます。

  • マシン   同じオプションを、Web.config ファイルの場合と同様に、Machine.config ファイルで構成できます。

  • ページ   個々のページのキャッシュは、構成ファイルで定義されたキャッシュ プロファイルを適用して構成できます。または、@ OutputCache ディレクティブで個々のキャッシュ プロパティを構成するか、またはページのクラス定義に属性を設定して構成することもできます。

  • コントロール   ユーザー コントロールのキャッシュは、ユーザー コントロール ファイルの @ OutputCache ディレクティブを設定するか、またはコントロールのクラス定義で PartialCachingAttribute 属性を設定して構成できます。

詳細については、「ASP.NET のキャッシュの構成」を参照してください。

IIS 6.0 を使用したメモリのリサイクル

メモリ リークが発生することがわかっている COM 相互運用アプリケーションなど、問題が発生するコードが含まれているアプリケーションがあり、問題のコード部分を記述し直すのが困難な場合に、アプリケーションを処理するワーカー プロセスを定期的にリサイクルすると、問題の拡大を抑制できることがあります。ワーカー プロセスをリサイクルすると、メモリ内でアプリケーションのインスタンスが置き換えられます。IIS 6.0 では、アプリケーション プールに割り当てられているワーカー プロセス (複数可) を再起動することで、ワーカー プロセスを自動的にリサイクルできます。これにより、アプリケーションの円滑な実行を維持できます。

リサイクル中の状態の維持

状態データに依存するアプリケーションがアプリケーション プールに存在する場合、そのようなアプリケーション プールに割り当てられているワーカー プロセスをリサイクルするかどうかを決定する必要があります。ワーカー プロセスをリサイクルすると、プロセスで維持されているアプリケーションの状態データが失われます。この場合、リサイクルしないというのも選択肢の 1 つです。

データベースなど、ワーカー プロセスの外部に状態データを保持することで、状態に関する問題を解決してプロセスをリサイクルできます。ただし、リサイクルするために状態データをプロセス外に保持することは、次の点でサーバーのパフォーマンスに影響します。

  • アプリケーションとデータ ストアとの間のデータ移動に必要な管理オーバーヘッドにより、パフォーマンスが低下します。

  • リサイクルによりインプロセス データ キャッシュがフラッシュされるので、キャッシュを再度ビルドする必要が生じます。

ASP.NET には、セッション状態サービスまたは SQL データベースを使用してセッション状態を維持するオプションが用意されています。詳細については、「セッション状態モード」を参照してください。

リサイクルの詳細については、「Recycling Worker Processes (IIS 6.0)」を参照してください。

ネイティブ イメージ サービス

ネイティブ イメージ サービス は、ネイティブ イメージを生成および管理する Windows サービスです。ネイティブ イメージとは、コンパイル済みのプロセッサ固有のマシン コードを含むファイルです。ネイティブ イメージ サービスを使用すると、コンピュータがアイドル状態になるまでネイティブ イメージのインストールとアップデートを遅延できます。ネイティブ イメージ ジェネレータ (Ngen.exe) は、マネージ アプリケーションのパフォーマンスを向上するツールです。Ngen.exe は、ネイティブ イメージを作成し、それをローカル コンピュータのネイティブ イメージ キャッシュにインストールします。ランタイムは、JIT (Just-In-Time) コンパイラを使用してオリジナルのアセンブリをコンパイルする代わりに、キャッシュにあるネイティブ イメージを使用できます。

詳細については、MSDN Magazine Web サイトの「NGen Revs Up Your Performance with Powerful New Features」を参照してください。

グローバル アセンブリ キャッシュと作業セット

プロセスの作業セットとは、物理 RAM メモリ内のプロセスが現在使用できるメモリ ページのセットです。このようなページは常駐しており、アプリケーションはページ フォールトをトリガしなくても使用できます。作業セットのサイズは、PeakWorkingSet プロパティと WorkingSet プロパティを使用して監視できます。アプリケーションの作業セットは、アセンブリをグローバル アセンブリ キャッシュに配置することで削減できます。この方法は、主に中間層の共有アセンブリにお勧めします。

参照

その他の技術情報

Chapter 4 — Architecture and Design Review of a .NET Application for Performance and Scalability

Chapter 6 — Improving ASP.NET Performance

Microsoft Patterns and Practices