WebRoleでWebガーデンを構成してスケールアウトさせる


IIS7.0/IIS7.5でのWebガーデンについての記述が見つからなかったので、TechNetの「第 2 章 ‐ IIS 6.0 のアーキテクチャ」から引用させて頂くと、

「Webガーデン」とは、複数のワーカープロセスを実行するように構成されているアプリケーションプールのことです。既定では、IIS 6.0のアプリケーションプールには、ワーカープロセスがそれぞれ1つしかありません。作業を分担する同等のワーカープロセスを複数持つようにアプリケーションプールを構成すれば、「Webガーデン」を作成できます。Webガーデンでは、http.sysによって、アプリケーションプール内の一連のワーカープロセスの間で要求が分散されます。

メモ Webガーデンを「Webファーム」と混同しないようにしてください。Webファームは、クラスタ化や負荷分散を使用して複数のサーバーで実行されるWebサイトやWebホスティングサービスです。

Webガーデンでは、より多くの負荷に対応でき、1つのワーカープロセスが応答を停止しても他のワーカープロセスが要求を受け取って処理できます。Webガーデンを利用すれば、アプリケーションプール内のアプリケーションのパフォーマンスと信頼性を高めることができます。

アプリケーションプールで要求を処理できるワーカープロセスの最大数は、Max Processesメタベースプロパティによって決まります。Webガーデンの作成方法などの詳細については、本書の「第3章 アプリケーションサーバーとしてのIIS 6.0の実行」、およびIIS 6.0ヘルプの「Webガーデンを構成する」を参照してください。IIS 6.0のヘルプは、MMCの[インターネットインフォメーションサービス(IIS)マネージャ]スナップインから表示できます。

Azureというか、IISの既定ではワーカプロセス数は”1”となっています。VMサイズがMidium以上の場合は複数のコアがありますので、それを有効活用するようにワーカプロセス数を増やしスケールアウトする事により、パフォーマンス等が改善する可能性があります。なお、WebRoleを複数インスタンス実行すればWebファームと言う事になるかと思います。

例によって、WebRole.csでワーカプロセス数を変更するサンプルを載せておきます。このサンプルコードでは、環境変数からCPUコア数を取得して、その数分ワーカプロセスを起動するようにしてみました。

 

   1: using System;

   2: using System.Collections.Generic;

   3: using System.Linq;

   4: using Microsoft.WindowsAzure;

   5: using Microsoft.WindowsAzure.Diagnostics;

   6: using Microsoft.WindowsAzure.ServiceRuntime;

   7:  

   8: using Microsoft.Web.Administration;

   9:  

  10: namespace MvcWebRole

  11: {

  12:     public class WebRole : RoleEntryPoint

  13:     {

  14:         public override bool OnStart()

  15:         {

  16:             // For information on handling configuration changes

  17:             // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

  18:  

  19:             //IISの設定をします

  20:             IISSetting();

  21:  

  22:             return base.OnStart();

  23:         }

  24:  

  25:         private void IISSetting()

  26:         {

  27:             using (ServerManager serverManager = new ServerManager())

  28:             {

  29:                 //環境変数からCPU数を取得します。

  30:                 var cpuNum = Convert.ToInt16(Environment

  31:                     .ExpandEnvironmentVariables("%NUMBER_OF_PROCESSORS%")); 

  32:  

  33:                 var sitename = RoleEnvironment.CurrentRoleInstance.Id + "_Web";

  34:                 var appPoolNames = serverManager.Sites[sitename]

  35:                                     .Applications

  36:                                     .Select(app => app.ApplicationPoolName)

  37:                                     .ToList();

  38:  

  39:                 foreach (var appPoolName in appPoolNames)

  40:                 {

  41:                     //アプリケーションプールを構成します

  42:                     var pool = serverManager.ApplicationPools[appPoolName];

  43:                     //プロセスをCPU数分起動しWebガーデンを構成します。

  44:                     pool.ProcessModel.MaxProcesses = cpuNum;

  45:                 }

  46:                 serverManager.CommitChanges();

  47:             } 

  48:         }

  49:     }

  50: }

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中