コンテンツへスキップ
ASP.NET アプリのパフォーマンスを向上させるための12のヒント–パート1

ASP.NET アプリのパフォーマンスを向上させるための12のヒント–パート1

Webサーバー上でのWebアプリケーションの構築とホスティングは、ASP.NET とIISを使用すると非常に簡単です。ただし、多くの機会と隠れた構成を微調整して、高性能のWebアプリケーションにすることができます。このシリーズの投稿では、どのWebアプリケーションにも簡単に適用できる、最も未使用または無視されるトリックのいくつかについて説明します。

読者8分

Webサーバー上でのWebアプリケーションの構築とホスティングは、ASP.NET とIISを使用すると非常に簡単です。ただし、多くの機会と隠れた構成を微調整して、高性能のWebアプリケーションにすることができます。このシリーズの投稿では、どのWebアプリケーションにも簡単に適用できる、最も未使用または無視されるトリックのいくつかについて説明します。

1.カーネルモードキャッシュ

これは、Webアプリケーションを高速化する、書き込みに広く使用されている主要なツールの1つです。しかし、ほとんどの場合、私たちはそれを最適に使用せず、いくつかの大きな利点を残しています。 各 asp.net リクエストはさまざまな段階を経るため、以下のように複数のレベルでキャッシングを実装できます。

 request response

リクエストが最初にHTTP.sysによって受信されることがわかりますので、カーネルレベルでキャッシュされている場合、OSカーネルに座ってTCPレイヤーから直接リクエストをリッスンするHTTPリスナーであるためHTTP.sys、サーバーに費やすほとんどの時間を節約できます。IIS/ASP.NET パイプライン、ページのライフサイクル、カスタム コード、DB にかかる時間などに費やすすべての時間を節約できます。それをどのように実装できるか見てみましょう。

a)      IISに移動し、Webサイトを選択します。

b)      IISセクションの右側にある[出力キャッシュ]アイコンをクリックします。

c)       右側のパネルで、[アクション]の下の[追加]をクリックします。次のダイアログが開きます。

ここでは、赤い丸で囲まれた領域で、カーネルでキャッシュするファイル拡張子を定義する必要があります。2番目の囲まれた領域では、チェックボックスを選択する必要があります。3 番目の円で囲まれた領域は、キャッシュを無効にするために 3 つのオプションが提供されていることを示しています。私たちの要件に基づいて、それを構成できます。

注 – カーネルレベルでのオーバーキャッシングにはいくつかの制限があります。IIS のすべての機能はユーザー レベルで実装されているため、これらの機能を活用することはできません。実装できないカーネルキャッシングの完全なリストについては、このMSDNの記事を参照してください。

2. パイプライン モード (IIS 7+ で利用可能)

アプリケーション プール レベルでは、クラシックと統合の 2 つのパイプライン モードを使用できます。クラシックは、IIS6 から移行されたアプリケーションをサポートするために使用できます。それでは、まず、これらのモードを理解しましょう。IIS には、IIS のモジュールとして実装される多くの機能が提供され、同様に、多くの機能は ASP.NET パイプラインの一部である HTTP モジュールとして実装されます。クラシック モードでは、各要求は IIS パイプラインを通過し、次に ASP.NET パイプラインを通過してから処理されます。

認証など、両方のパイプラインの一部である多くの機能があります。統合モードの場合、これら 2 つのパイプラインは 1 つにマージされ、すべてのモジュール (IIS と ASP.NET) は 1 つのイベントから呼び出されるため、冗長性が減り、アプリケーションのパフォーマンスに非常に役立ちます。

パイプライン モードを設定/更新するには、目的のアプリケーション プールを選択し、プロパティを右クリックします。

edit app pool

ここでは、上の写真で囲まれているように、パイプラインモードを設定できます。

注 – 盲目的に変更しないでください、アプリケーションが IIS6 から移行された場合は、それに依存している可能性があります。徹底的に変更した後、先に進む前にテストしてください。

3. Remove Unused Modules

各要求は、多くの HTTP モジュールと、最後に次のように要求を処理する 1 つの HTTP ハンドラを含む ASP.NET パイプラインを通過しました。

ここでは、リクエストが各モジュールを通過し、ハンドラによって処理され、同じモジュールを介して再び通過することがわかります。ASP.NET アプリケーションでデフォルトで有効になっているモジュールの数を見てみましょう。すべてのモジュールを取得するために、以下のコードを追加しました。

HttpApplication httpApps = HttpContext.ApplicationInstance;
 
//Get list of active modules
HttpModuleCollection httpModuleCollections = httpApps.Modules;
ViewBag.ModulesCount = httpModuleCollections.Count;

このコレクションは任意のコントロールにバインドでき、次のように表示されます。

18のモジュールが表示され、そのうちのいくつかは使用されていない可能性がありますが、各リクエストはこれらのモジュールを経由する必要があります。そのため、これらのモジュールをパイプラインから削除できます。モジュールを削除するには、web.config に次のように構成を追加する必要があります。

 <system.webServer>
    <modules>
      <remove name="FormsAuthentication" />
      <remove name="DefaultAuthentication" />
      <remove name="OutputCache" />
      <remove name="AnonymousIdentification" />
      <remove name="RoleManager" />
    </modules>
  </system.webServer>

ここでは、削除タグを使用して削除するモジュールをリストアップします。ここで追加したように、5つのモジュールを削除し、次にアクティブなモジュールを確認すると、13になります。

注 – このデモでは、VS 2013 を使用しており、別のバージョンを使用すると異なる番号が表示される場合がありますが、重要な点は、不要なモジュールをすべて削除する必要があるということです。

4. runAllManagedModulesForAllRequests

これは、web.configまたはapplicationHost.configで確認した別の構成であり、そのIIS上のすべてのアプリケーションに対して次のようにグローバルに設定されています。

<modules runAllManagedModulesForAllRequests="true">

これは、アプリケーションに来るすべてのリクエストに対してすべてのモジュールが実行されることを意味しますが、CSS、js、jpg、HTMLなどの他のファイルではなく、ASP.NET ファイルのみを実行する必要があるため、通常はそれは必要ありません。これは、これらのリソースの要求がパイプラインを通過することさえ意味しますが、これはこれらのファイルにとって不要であり、余分なオーバーヘッドを追加するだけです。しかし、アプリケーションレベルでそれを単に偽にすることはできません。したがって、2つの方法があります–

a)      これらの静的リソースを提供するためだけに別のアプリケーションを作成し、web.configでこの設定をfalseに設定します。

b)      または、同じアプリケーションで、すべての静的リソースをフォルダに配置し、そのフォルダに固有のweb.configファイルを追加してfalseにします。

 

5. フォルダ c:\inetpub\wwwroot には何も書き込まないでください

ファイルウォッチャーはフォルダを検索し、このフォルダに変更がある場合は対応するアプリケーションプールを再起動します。この機能は IIS で使用できます。web.config またはファイルに変更があった場合は、アプリケーション プールが再起動され、変更されたアプリケーションが要求を処理できるようになります。ここで、アプリケーションログをアプリケーションフォルダ内のテキストファイルに書き込んで、各リクエストにいくつかのエントリを作成すると、アプリケーションプールは何度も再起動し、アプリケーションにとって危険です。したがって、このフォルダには、アプリケーションバイナリの一部でなくなるまで、何も書き込んだり変更したりしないでください。

6.余分なビューエンジンを取り外します

a) ご存知のように、ビュー エンジンは MVC 要求のライフ サイクルの一部であり、ビューの検索と処理を担当します。これにより、独自のカスタムビューエンジンも追加できます。既定の MVC アプリケーションを作成し、ソリューションに存在しないビューを返そうとしましょう。ここで、このアプリケーションを実行すると、次のエラーが表示されます。

これは、すべての可能な場所にかみそりとaspxファイルを探していることを示しています。しかし、私たちが知っているように、私たちはかみそりビューエンジンを使用しているので、他のaspxファイルを見るのに時間を無駄にしないでください。したがって、余分なビューエンジンをすべて削除する必要があります。 Global.asax で利用可能な Application_Start メソッドに次のコードを追加する必要があります。

// Removing all the view engines
ViewEngines.Engines.Clear();
 
//Add Razor Engine (which we are using)
ViewEngines.Engines.Add(new RazorViewEngine());

それでは、もう一度実行してみましょう

今、それはかみそりファイルだけを探しています

b)      上記の画面を注意深く見ると、c#ファイルとvbファイルを探していることがわかり、ソリューションではvbを使用したことがないので、vbhtmlファイルを探しても無駄です。これを修正するには、独自のカスタムViewEngineを作成する必要があります。それでは、カスタム RazorViewEngine を次のように記述してみましょう。

    public class MyCustomViewEngine : RazorViewEngine
    {
        public MyCustomViewEngine()
        {
            base.AreaViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml"};
            base.AreaMasterLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml" };
            base.AreaPartialViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml","~/Areas/{2}/Views/Shared/{0}.cshtml"};
            base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
            base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
            base.PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
            base.FileExtensions = new string[] { "cshtml" };
        }
    }

ここでは、RazorViewEngineから継承しており、コンストラクタを見ると、ファイルが存在する可能性のあるすべての場所が定義されていることがわかります。これには、可能なファイル拡張子も含まれます。次に、このビューエンジンをGlobal.asaxで使用しましょう。

そして、アプリケーションを実行します。

今では、理にかなったパフォーマンスに適したcsharpかみそりファイルを探します。

結論

この投稿では、どの ASP.NET アプリケーションにも簡単に適用できる次の6つのヒントについて説明しました。

1 –   カーネルモードキャッシュ

2 – Pipeline mode

3 –  Remove unused modules

4 –   runAllManagedModulesForAllRequests

5 –  Don’t write in wwwroot

6 –  未使用のビュー エンジンと言語を削除する

シリーズの次の投稿では、アプリケーションのパフォーマンス向上として機能する5つのヒントについて説明します。

 

デモを予約