プロセス分離によるサーバーの信頼性向上

J.D. Meier
Microsoft Corporation

November 22, 1999

目次
はじめに
プロセスを分離する
MTS パッケージ アイデンティティ
分離の舞台裏
IIS 5.0 での変更点
まとめ

はじめに

Web サーバーの信頼性向上は、今も Active Server Pages (ASP) の開発者とシステム管理者の共通の目標です。現実を直視しましょう。ASP アプリケーションをサーバー上で実行すると、サーバーの状態が不安定になり、サーバーがダウンすることもあります。コードの不手際から予想外の実行時の問題まで、さまざまな問題があなたのサーバーの可用性を損なうことがあります。

これがデスクトップ アプリケーションでは、リスクは最小で済みます。通常、特定のプロセス下で 1 つのアプリケーションしか実行しないからです。そのプロセスにたまたま問題が発生しても、影響を受けるのはそのアプリケーションだけです。しかし、Internet Information Server (IIS) では、いくつかのアプリケーションが同じプロセス空間を共有するのが一般的なので、1 つの行儀の悪いアプリケーションがサーバー全体を危険にさらすことがあります。

幸い解決策があり、それは少し前から利用可能になっています。プロセス分離は、IIS 4.0 で導入され、メイン IIS プロセスの保護を可能にします。堅牢なエラー処理に代わるものではありませんが、Web サーバーの堅牢性を一段引き上げます。

この機能がかなり以前から利用できるようになったにもかかわらず、プロセス分離はいまだにブラックボックスとして扱われることが少なくありません。この記事では、IIS 4.0 でのプロセス分離の仕組みを説明します。また、IIS 5.0 でのいくつかの変更点も取り上げ、Microsoft Transaction Server (MTS) との関係も説明します。この記事を読み終わる頃には、Web アプリケーションを個別のメモリ空間で実行するように構成できるようになるだけでなく、これがあなたのアプリケーションにどのような影響を与えるかを理解できるでしょう。

プロセスを分離する

この分離がどのように作用するかを説明する前に、Web ベース アプリケーションをアウトプロセスで実行させることによって、実際に体験してみましょう。テスト目的の新しい Web アプリケーションを作成するか、設定をテストできる既存の Web アプリケーションを使用してください。

Web アプリケーションを分離されたプロセスで実行するように構成するには、Internet Service Manager (ISM) を使用します。ISM には、IIS 4.0 がインストールされた Windows NT 4.0 環境下では、通常 [Windows NT Option Pack] プログラム グループからアクセスできます。ISM を起動した後、以下の手順に従って、Web アプリケーションを分離されたプロセスで実行してください。

  1. ISM の左側のウィンドウから Web アプリケーションをクリックします。

  2. コンテキスト メニューの [プロパティ] をクリックします。

  3. Web アプリケーションのプロパティが表示されたときに、下の図 1 のように [作成] ボタンが表示されていた場合は、[作成] ボタンをクリックする必要があります。アプリケーションがアプリケーション ルートとしてマークされます。[作成] ボタンが [削除]ボタンに変わります。[削除] ボタンをクリックすると、そのアプリケーションのアプリケーション ルートとしてのマークをはずすことができます。

    Create button is enabled

    図 1. [作成] ボタンが使用可能。

  4. [別のメモリ領域で実行する] チェック ボックスをクリックします。図 2 を参照。

    Run in separate memory space

    図 2. [別のメモリ領域で実行する]

  5. [適用] ボタンをクリックします。

これで、Web アプリケーション プロセスを IIS から分離できました!

ここまでの手順についていくつか注意しておくべき点があります。手順 3 で [作成] ボタンをクリックしたとき、アプリケーションのエントリがメタベースに追加されました。メタベースは IIS 4.0 で導入され、IIS の構成パラメータを保持しています。レジストリより速く、フレキシブルです。メタベースの詳細については、NT Option Pack のドキュメンテーションまたは Knowledge Base (KB) の記事 Q240225「Description of Adsutil and MetaEdit Utilities Used to Modify the Metabase」 Non-MSDN Online link を参照してください。

メタベースを調べる方法はいろいろありますが、私は adsutil.vbs という名前のユーティリティを使用しています。これは、NT Option Pack のインストール時に Windows Script Host をインストールするように指定した場合にインストールされます。Windows Script Host の詳細については、https://www.microsoft.com/japan/msdn/scripting/ Non-MSDN Online link をご覧ください。

コマンド プロンプトから、次のようなコマンドを発行すると、

                  
adsutil.vbs enum /w3svc/1/root/servinitup

アプリケーション ルートのアプリケーション プロパティをコンソール ウィンドウにダンプすることができます。

図 3 を見るとわかるように、AppIsolatedTrue に設定されています。これは、手順 4 で [別のメモリ領域で実行する] をクリックしたからです。AppPackageNameAppPackageID に注目してください。Web アプリケーションが IIS のインプロセスで実行されるように設定されていた場合は、これらのエントリは表示されません。

Metabase entry

図 3. 私の ServinItUp アプリケーション ルートのメタベース エントリ

MTS パッケージを見てみると、ISM によって手順 4 で作成された新しい MTS パッケージがあります (MTS 情報は、IIS 情報の下にあります)。図 4 を参照してください。

MTS package

図 4. 新しい MTS パッケージ

MTS パッケージ アイデンティティ

新しい MTS パッケージを右クリックして、[プロパティ] をクリックします。[Identity] タブに切り替えると、パッケージ アイデンティティとして使用されるアカウントが表示されます。[Identity] タブは、Web アプリケーションの分離にとって非常に重要であり、知っておく必要がある落とし穴がいくつかあります。

MTS package identity

図 5. MTS パッケージ アイデンティティ

ここでは [Interactive User] か特定のアカウントのどちらかを選ぶ必要があります。デフォルトは、NT Option Pack のインストール時に選択したオプションによって決まります。

[対話ユーザー] としてパッケージを実行した場合、限られたユーザーだけがマシンにログオンしているときや、誰もマシンにログオンしていないとき (通常は実働用マシンの場合)、問題が生じることがあります。一般的な症状としては、以下のものがあります。

一般に、アプリケーションの実行時の動作は誰が Web サーバーにログオンしているかによって変わるので、対話ユーザー に依存することはお勧めできません。

図 5 に示されている IWAM_<machine> (短縮して IWAM と呼びます) アカウントは、ちょっとしたトリックを知らないと、よくある問題の原因となりえます。IWAM アカウントは重要なアカウントです。これは、Web アプリケーションを IIS からアウトオブプロセスで実行するように設定したときに使用されるデフォルトのアカウントです。

NT ユーザマネージャーを通じて IWAM アカウントのパスワードを変更したときに、その変更を IIS に知らせずにおくと、問題が発生します。IWAM アカウントには、IUSR アカウントのようなパスワード同期オプションがないので、手動で IIS の設定を更新する必要があります。IUSR のパスワード同期オプションは、USERMGR での変更をメタベースに格納されている IUSR のパスワードと自動的に同期します。USERMGR で IWAM アカウントのパスワードを変更した場合は、すでに IIS 用に作成したアウトオブプロセス アプリケーションについても、MTS パッケージに同じ変更を加える必要があります。また、メタベースの WAMUserPass プロパティにも変更を加える必要があります。これは、IIS が将来、新しいアウトオブプロセス アプリケーションを作成するときに使用する IWAM アカウント情報を格納する場所です。

メタベース内の IWAM パスワードを手動で同期しないと、MTS Server パッケージの作成に問題が生じるでしょう。残念ながら、それが何を意味するかがわかっていないと、その状況から事態を認識することはできません。Server パッケージのアイデンティティが "Y" と表示された場合には、IWAM アカウントは同期していません。詳細については、次の KB の記事を参照してください。Q195956 Cannot Set AppRoot OutProc, MTS Package Identity Set to "Y" Non-MSDN Online link

分離の舞台裏

Web アプリケーションを分離するとき、正確にはどんなことが行われているのでしょうか? 要するに、Web アプリケーションが MTX.EXE (MTS ランタイム) の新しいインスタンスにロードされます。タスク マネージャを起動して、[プロセス] を表示すると、MTX.EXE のインスタンスが少なくとも 1 つは表示されるはずです。

インプロセス Web アプリケーションをホストしている MTX.EXE のインスタンスが 1 つあり、分離された Web アプリケーションのそれぞれについて 1 つずつ個別のインスタンスがあります。しかし、それ以外の MTX.EXE インスタンスは、Web アプリケーションに対する要求が行われるまでロードされません。

MTX.EXE の新しいインスタンスのほかに、Web アプリケーションのための追加のスレッド プールが作成されます。ASP スレッド プールは MTS によって管理され、デフォルトでは、プロセッサ当たり 10 個のスレッドを持っています。アウトオブプロセス Web アプリケーションごとに専用の ASP スレッド プールが用意されます。このスレッド プールと、I/O のために使用される IIS のメイン スレッド プールとを混同しないでください。

あなたがコンポーネント開発者であれば、もう 1 つのおまけがあります。通常、IIS が使用中の DLL を再コンパイルしようとすると、Permission Denied エラー メッセージが表示されます。残念ながら、これを避けるためには、Web サービスを停止して、再開する必要があります。しかし、Web アプリケーションが分離されているときには、ISM を通じてアンロードするだけで済みますので、DLL を再コンパイルすることができます。Web アプリケーションの親 MTX.EXE プロセスをアンロードするには、ISM を通じて Web アプリケーションのプロパティを表示して、[アンロード] ボタンをクリックします。

このすべては素晴らしく聞こえます。では、何か注意することはないのでしょうか? クロスプロセス コールを行うとかならず、マーシャリングのためにパフォーマンスの低下が見られます。パラメータを値で渡すことによって、パフォーマンスの低下を最小に抑えることができます。アーリー バインディングを利用することもできます。これらのテクニックを組み合わせれば、プロセス間のラウンド トリップを大幅に減らして、パフォーマンスを向上させることができます。

Web アプリケーションのプロセス アイデンティティは、Web アプリケーションの MTS パッケージの Identity 設定によって決まることも知っておく必要があります。デフォルトでは、IWAM_<machine> アカウントです。セキュリティ コンテキストが問題に関係していると思われるときには、このことを思い出してください。

IIS 5.0 での変更点

現在、Win2000 Beta RC3 上で実行している IIS 5.0 の時点で、アプリケーション分離についていくつかの変更があります。重要な変更点のいくつかについて、概要を説明します。Windows 2000 の最終リリースが出荷されるときには、変更点の詳細がドキュメンテーションに記載されるはずです。

最もわかりやすく、よく話題に上っている変更点は、MTS が COM+ に変わったことです。これにより、MTS、COM、および DCOM が効率的にまとめられました。MTX.EXE ではなく、Dllhost.EXE が動作していることに気づくでしょう。

スレッド プールに関しては、デフォルトのスレッド数が 25 に引き上げられました。プロセッサ当たり 10 個のスレッドが MTS によって管理される代わりに、プロセッサ当たり 25 個のスレッドが COM+ によって管理されます。このルールは、それぞれのアウトオブプロセス Web アプリケーションに適用されます。

[別のメモリ領域で実行する] が化粧直しされました。プールド (pooled) プロセスという新しいコンセプトが追加されました。基本的に、3 つの分離レベルから選ぶことができるようになります。

  1. Low (IIS プロセス)
  2. Medium (プールド)
  3. High (分離)

Low は、Web アプリケーションが Inetinfo.exe で実行されることを意味します。Medium では、複数のアウトオブプロセス Web アプリケーションで Dllhost.EXE のインスタンスを共有することができます。High は、1 つの Web アプリケーション専用の Dllhost.exe のインスタンスが用意されることを意味します。これは IIS 4.0 の [別のメモリ領域で実行する] オプションと同じですが、IIS 5.0 では、アウトオブプロセスでの実行に伴うパフォーマンスの低下を大幅に抑えることができるようになっています。これと ASP の全体的なパフォーマンスの向上により、アウトオブプロセスのパフォーマンスは IIS 4.0 のインプロセスのパフォーマンスを上回ります。

まとめ

ASP アプリケーションをサーバー上で実行しているときには、サーバーの安定性はあなたの限界を越えるほど高い必要はありません。ご覧のように、分離には課題もあります。しかし、分離の仕組みを理解すると同時に、これらの課題を解決するノウハウも理解していただけたはずです。詳細については、Windows DNA from Design to Deployment - How to Avoid Critical Problems Non-MSDN Online link と Solving Problems in Windows DNA Solutions Non-MSDN Online link をご覧ください。結局、サーバーの強化は、分離とは何かを理解するためにあなたが費やした時間を補ってあまりあるものをもたらすでしょう。

J.D. Meier は米国東海岸で生まれて育ちました。Horace Greeley の助言に従って、MTS および ASP 技術を含むサーバー側コンポーネントと Windows DNA アプリケーションを専門とするデベロッパ サポート エンジニアとして働いています。