連載:コードから触るIIS 8

連載:コードから触るIIS 8

Webガーデンによるアプリケーションプールのマルチプロセス化

2014年3月7日

ASP.NET アプリのスケーリング方法を解説。今回は、Webサイトを1つのアプリケーションプール上の複数のワーカープロセスで動かす「Webガーデン」について説明する。

株式会社グラニ 田中 孝佳
  • このエントリーをはてなブックマークに追加

 前回の記事ではSignalRのスケーリングについて説明したが、一般のIISに載ったASP.NETアプリケーションでのスケーリングについて今回から説明していきたい。

 IISおよびASP.NETアプリケーションのスケーリングでは、IISの「Webファーム」という機能を利用することで、複数のIISを水平に並べる方法を採ることができる。これについては次回以降で説明することとし、今回は1台のIIS上のASP.NETのアプリケーション(Webサイト)を、1つのアプリケーションプール上の複数のワーカープロセスで動かす「Webガーデン」について説明したい。

 なお、1つのWebサイトを複数のアプリケーションプールで動かす方法もあるが、これは1つのサイトを異なる複数のアプリから構成する場合に使うことが多く、今回の連載では触れない予定である。

IISのアーキテクチャとWebガーデン

 ここで、IISにおけるWeb Serverのプロセス構造について説明する。

IIS 6のアーキテクチャ
IIS 6のアーキテクチャ

Improving .NET Application Performance and Scalability Chapter 6 - Improving ASP.NET Performance」より抜粋。IIS 6について書かれているが、大まかなアーキテクチャはIIS 8でも同じである。

 ASP.NETの機能は、Webサーバー内のアプリケーションプールが持っているワーカープロセス内で実行される。HTTP.sysがWebサーバーに来たHTTPリクエストを受け、適切なワーカープロセスに処理を受け渡す。従って、そのワーカープロセスが停止していたり、ビジー状態で応答できなかったりした場合は、HTTP.sysが処理を受け渡せず、エラー画面を表示することになる。

 そこで、アプリケーションプールを複数のワーカープロセスで実行するようにすると、1つのワーカープロセスが停止もしくは応答しない場合でも、別のワーカープロセスが処理を継続できる。これを「Webガーデン」と呼んでいる。

 Webサイトに対してWebガーデンを有効にするには、アプリケーションプールのワーカープロセスの数を直接指定すればよい。具体的には、IISマネージャーを開き、アプリケーションプールの一覧(次の画面)から該当のアプリケーションプールの[詳細設定]を開く。

IISマネージャーからアプリケーションプールの画面を開いたところ

 [詳細設定]ダイアログの[ワーカー プロセスの最大数]の値を「2」以上にすれば、指定したプロセス数を最大数としてワーカープロセスが実行される(CPUの数などの条件で、この最大数まで増えないケースも確認しているが、具体的な条件などは確認できていない)。これでWebガーデンの設定は完了である(つまり、設定画面上に表立って「Webガーデン」という名前は表示されない)。

アプリケーションプールの[詳細設定]画面から[ワーカー プロセスの最大数]を設定しているところ
アプリケーションプールの[詳細設定]画面から[ワーカー プロセスの最大数]を設定しているところ

 [詳細設定]ダイアログの[OK]ボタンを押した後、このWebサイトに数回アクセスしてみると、次の画面例のように、「w3wp」という名前のワーカープロセスが2つ動いていることが確認できる。

Get-Processコマンドでw3wpプロセスの数を確認しているところ
PowerShellのGet-Processコマンドでw3wpプロセスの数を確認しているところ

なお、他のWebサイトのアプリケーションプールが動いていると、そのアプリケーションプールも表示されるので注意されたい。

 また、この[ワーカー プロセスの最大数]には「0」を入れることができる。「0」を入れた場合、OSのNUMAノードの数に応じた値を設定したのと同じになる。試しに、Windows AzureのXLインスタンス上で動かした場合の図を以下に載せてみた。NUMAノードが有効かどうかは、APIも用意されているが、タスクマネージャーから見てみるのが一番簡単だろう。

NUMAノードが有効になる、Windows AzureのXLインスタンスで、タスクマネージャーのパフォーマンス画面から[CPU]のグラフ部分を右クリックしたところ

[グラフを変更]で、[NUMA ノード]の選択を有効にできる。なお、この画面では、すでにNUMAノードのグラフを表示している。この例では、グラフが2つ表示されているため、NUMAノードの数は「2」である。

 この環境で[ワーカー プロセスの最大数]を「0」にして、該当のWebサイトに何度かアクセスすると、次の画面に示すように、w3wpが2つ動いているのを確認できる。

PowerShellのGet-Processコマンドでw3wpプロセスの数を確認しているところ

Webガーデン使用時に留意すること

 このようにWebガーデンを使うと、サーバーの台数を増やすことなくIISの設定のみで比較的容易にスケールアウトできるが、留意しないといけない点もある。

 まず、ワーカープロセス分、メモリの使用量が増える。セッションをインメモリに格納するようにしていたり、インメモリに保存するキャッシュを利用していたりする場合などは、メモリ使用量を確認しながらワーカープロセスの数を調整する必要があるだろう。

 また、別プロセスであるため、排他制御にも留意しないといけない。C#のlockステートメントで排他制御を行うことがあるが、これはプロセス内での排他制御であるため、ファイルシステムなどunmanagedなOSなどのリソースを排他的に使用する場合には不適切である。System.Threading.MutexSystem.Threading.Semaphoreといったプロセス間での同期に使えるAPIを利用する必要がある。同様にログをファイルシステムに出力する場合も、異なるプロセスで同じファイルにログを出力する可能性があるため、利用しているログのライブラリに合わせて、プロセスごとに別のファイルに出力するなどの対応が必要だろう。

 今回は、1つのWebサーバーでスケールすることができる「Webガーデン」の機能について説明した。次回以降は数回にわたって、スケールアウトするための複数のWebサーバーをIISの機能として管理できる「Webファーム」について説明する。

※以下では、本稿の前後を合わせて5回分(第6回~第10回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

6. Windows Server 2012 R2とIIS 8.5の新機能

先日(11月1日)から製品販売が開始されている「Windows Server 2012 R2」の新機能の中から「PowerShell DSC」について紹介。また、そのOS上で動くIISの最新版「IIS 8.5」の新機能も説明する。

7. RedisをBackplaneとしたSignalRのスケールアウト

SignalRアプリをスケールアウトする際の注意点と、それを回避するためのBackplane機構について説明。さらにRedisをBackplaneとして活用する方法を解説する。

8. 【現在、表示中】≫ Webガーデンによるアプリケーションプールのマルチプロセス化

ASP.NET アプリのスケーリング方法を解説。今回は、Webサイトを1つのアプリケーションプール上の複数のワーカープロセスで動かす「Webガーデン」について説明する。

9. Webファームによる負荷分散(1): Webファームの基本構造と構成

ASP.NETアプリをスケーリングする方法の1つとして、複数のサーバーによる水平負荷分散を実現する「Webガーデン」というIIS機能について説明する。

10. Webファームによる負荷分散(2): IISマネージャー/コードによる操作

Webファームに備えられている機能とは? IISマネージャーによるWebファームの操作や、コードによる操作について説明する。

サイトからのお知らせ

Twitterでつぶやこう!