IIS のアプリケーションプールとは?

以前の記事「IIS のウェブアプリケーションとは?」では、 仮想ディレクトリを "ウェブアプリケーション" に変換するところみました。

まだ読んでない人は目を通して置いてください。

ウェブアプリケーションとなった場所は、IIS マネージャーからは黄色いフォルダーアイコンではなく、青い地球アイコンに代わるのでしたね。

そして、ウェブアプリケーションには、アプリケーションプールを割り当てました。では一体、アプリケーションプールとは何でしょうか?

IIS のアプリケーションプールとは?

IIS の「アプリケーションプール」というのは、IIS のウェブアプリケーションの「ワーカープロセス」の設定のことです。 そして「ワーカープロセス」というのは、そのウェブアプリケーションが実行されるプロセスのことです。

プール (pool) という言葉は、泳ぐ場所としてのプール(スイミングプール)という意味もありますが、「共有して使うもの・お金」という意味もあります。

ここでいう、アプリケーションプールというのは 「同じワーカープロセスを共有するウェブアプリケーション群」という意味です。

ワーカープロセスは w3wp.exe

IIS 本体のプロセスと、アプリケーションを動かすためのプロセスを分けることによって、IIS 本体がユーザーが作ったアプリケーションの影響を極力受けないように配慮されているのです。

ワーカープロセスの名前は w3wp.exe といいます。一方、IIS 本体のサービスは svchost.exe というプロセス名です。

試しに tasklist コマンドに /SVC オプションを渡して、どのサービスがどのプロセスでホストされているかみてみましょう。私の環境では次のようになりました。

>tasklist /SVC

Image Name                     PID Services
========================= ======== =============
System Idle Process              0 N/A
System                           4 N/A
smss.exe                       268 N/A
...
svchost.exe                   3204 SysMain
svchost.exe                   3232 W3SVC, WAS
WLIDSVC.EXE                   3308 wlidsvc
...

W3SVC という名前のサービスが svchost.exe (プロセスID はここでは 3232) で実行されています。これが 「IIS の本体」です。

ちなみに、この svchost.exe というプロセスは Windows で各種サービスをホストするための汎用プロセスです。 従って svchost.exe という名前でホストされているサービスは多数ありますので、svchost.exe というプロセスが見えたからと言って、 IIS ではありませんので注意してください。

なぜプロセスを分けるの?

プロセスを分離すると、ウェブサーバー及びその上で動くウェブアプリケーションの安定稼動という面ではいいことがたくさんあります。

例えばメモリリークを起こす不具合のあるアプリケーションがあったとします。メモリリークというのは、一度割り当てたメモリを解放しない(解放する術を失った)不具合です。

メモリの割当ては、プロセス毎のメモリ空間で閉じて考えることができます。プロセスがなくなれば仮想メモリ空間も消滅しますので、メモリリークの問題も同時に消滅します。メモリリークで問題が出てしまったら、問題のあるプロセスを終了してしまえばその問題は解消します。

そのためデスクトップで使うアプリケーションの場合、少々のメモリリークがあっても 「なんか、重くなってきたなぁ。一回リブートしてみるか。・・・お、治った」、などという解決方法(?)が効くわけですが、 サーバーを考える上ではそう簡単には行きません。基本的にサーバーには複数人数がアクセスしていると考えるので、誰かの都合で軽々しくリブートする、ということはなるべく避けたいところです。

そこで、特定のウェブアプリケーションを専用のワーカープロセスで実行しておきます。 するとそのアプリケーションで問題が発生したときは、そのワーカープロセスのみ一旦終了することができるようになります。プロセスを停止したことの影響範囲は、 サーバー全体には及ばず、同じプロセス上で実行されていたアプリケーションを利用している人だけに限定されます。

Windows ではプロセスの境界は非常に強力で、仮想メモリ空間の枠組みとか、セキュリティの影響範囲などが、それで区切られます。

これがワーカープロセスでアプリケーションをグループ分けする理由です。

ウェブアプリケーション境界は、「アプリケーションドメイン」

ちなみに ASP.NET のような .NET フレームワークアプリケーションでは、厳密にはセキュリティ境界はプロセスというより、「アプリケーションドメイン」 というものが境界になります。

このことが直接効いてくる場面はあまり多くありませんが、一応、頭に入れておきましょう。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 ASP.NET 入門