- PR -

Webサービスの同時処理数は2まで?

1
投稿者投稿内容
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 2004-01-22 23:22
Webサービスの同時処理可能数について、質問があります。
情報をお持ちの方がいましたら是非お願い致します。

今現在、下記のようなシステムをテストしております。

[client(IE6)] <--> [Webサーバ(ASPX)] <--> [APサーバ(WebService)] <-->[DB]

クライアントにUIを提供するWebサーバにはASP.NETのWebアプリケーションがあり、ビジネスロジックを担当するAPサーバにはXML Webサービスがあります。また、Webサーバ、APサーバはWindows 2003 Server、IISv6、.NET Framework v1.1、HyperThreadingという動作環境になっております。

問題点は、Webサーバを経由して複数のクライアント・リクエスト(実際にはWebサービスのWebMethodの呼出)によりAPサーバのWebサービスが呼ばれると、先着の2リクエスト以降は、一番目のリクエストの処理終了を待ってしまいます。Webメソッドは以下のようなテストコードです。1分以上の重い処理をさせるため、クライアント毎にファイルを作成し、書込みを行っているだけです。

[WebMethod]
public void ExecuteLongJob( string id )
{
StreamWriter sw = new StreamWriter( @"c:\" + id );
ファイル書込みを繰り返す(コード省略)
sw.Close();
}

このメソッドをA、B、C という3クライアントで順番にほぼ同時に呼び出させると、A、Bはほぼ同時に実行が開始され、処理時間もほぼ同じ、終了時間もほぼ同じでした。しかし、C(一番最後にメソッドを呼び出したクライアント)はAの処理の終了を待ってしまいました(処理時間は変わりませんでした)。

これは、一体何が起こっているのでしょうか?コード一行一行のトレースをとって見たところ、Webメソッドの同時呼出が2クライアントまでで制限されているように見えます。Webサービスはマルチスレッド動作しないのでしょうか?

宜しくお願い致します。

[ メッセージ編集済み 編集者: ryuuji 編集日時 2004-01-23 09:38 ]
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 2004-01-23 17:00
自己レスです。

色々と調べた結果以下のことが分かりました。

1.Wingowsアプリから直接Webサービスを呼び出すと、複数呼出が2クライアント先着という制限なしで同時実行される。

2.APサーバはクライアントがWindowsアプリかWebアプリケーションかは知る由も無いので、クライアント側(Webサーバ)に問題がありそうだ。

3.以下のスレッドにWebサービスがシングルスレッドでは無いことがMicrosoftの方が明記している。

#Are Web Services single-threaded?
http://www.gotdotnet.com/Community/MessageBoard/Thread.aspx?id=133703

4.テストでは3クライアント(ブラウザ)で行った結果、2リクエストのみ同時実行されていたが、クライアント数を12クライアントでテストしたところ、最大3リクエストが同時実行され、クライアント数により同時実行数が変わる。

以上から、Webサーバ(ASPX)のスレッドプールに原因があるのでは無いか?と考えております。
また、この会議室の以下のスレッドで挙がっているMachine.config内の<processModel>と<HttpRuntime>の設定値も変更して見ましたが、改善はされませんでした。


#件名:ASP.NET worker processのprocessModel
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2160&forum=7

[ メッセージ編集済み 編集者: ryuuji 編集日時 2004-01-23 17:02 ]
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-01-23 17:35
ほむらです。
関係ないかもしれませんが。。。
-------
IE(コンポーネント含む?)には同じサーバーへの同時に張れるコネクション数に制限があります。
このあたりは関係なかったりするのでしょうか?

#窓の手というツールでいじれます。。。
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 2004-01-23 18:20
返信、ありがとうございます。

上記の件、実際にためしてみました。
Max Connection at same timeのHTTP 1.0とHTTP 1.1が2になっていたので、それを5に変更し、再起動を掛けテストしたところ、変わりませんでした。また、テストは同一マシン内に複数ブラウザを立ち上げる方法と、複数マシンでブラウザを一個立ち上げる方法とて行っていますので、ブラウザ自体には問題が無い様に思えます。

相変わらずどこに原因があるのか特定できません。もう少し調べてみようと思います。ほむらさん、情報ありがとうございました。
未記入
会議室デビュー日: 2004/01/23
投稿数: 1
投稿日時: 2004-01-23 18:56
XMLウェブサービスのスレッドプーリングの設定ではないでしょうか?
VC.NETのATLサーバーで作成したXMLWebサービスの場合ですが、ISAPIのスレッドプーリングのデフォルト設定が2スレッドになっています。
じゅんじゅん
会議室デビュー日: 2004/01/24
投稿数: 4
投稿日時: 2004-01-24 00:21
はじめまして。

Webサービスの複数クライアントによる同時呼び出しについては、
machine.configファイルの <connectionManagement>要素の値で
設定できるようになってます。

デフォルトでは
<connectionManagement>
<add address = "*" maxconnection = "2" />
</connectionManagement>

になっていてPortが2つしか開きません。
Webサービスを、2つ以上同時実行させる場合には、このmaxconnection
の値を2以上に設定すればよいはずです。

ではでは。
ryuuji
ベテラン
会議室デビュー日: 2003/07/10
投稿数: 53
お住まい・勤務地: 東京都
投稿日時: 2004-01-26 09:27
皆さん、色々と有力な情報をありがとうございます。
遅くなりましたが、結果報告させて頂きます。
教えて頂いた方法を基に再度、テストしたところ上手く複数クライアントからのWebアプリケーションを通してWebサービスを同時に呼び出すことができました。

私がテストしたシステム構成は以下の通りでしたが、

[client(IE6)] <--> [Webサーバ(ASPX)] <--> [APサーバ(WebService)] <-->[DB]

まず、APサーバのクライアントであるWebサーバ側で、Machine.configファイルの<connectionManagement>のmaxconnectionの値で、APサーバへ同時接続可能な接続数を指定しなければいけません。テストでは10としました。さらに、APサーバ側ではXML Webサービスのスレッドプーリング値をMachine.configファイルの<processModel>要素内maxWorkerThreads、maxIoThreadsと、<httpRuntime>要素内minFreeThreadsで設定します(それぞれの意味はリファレンスに記載されています)。

注意点としては1回のWebサービスの呼出で、2つのスレッドが消費されるということです(恐らく監視用とメイン処理用)。なので、テストでは10クライアントからの同時呼出を行いましたが、この場合20個スレッドが必要になり、maxWorkerThreads(規定値20)を30に変更する必要(20以上という意味)がありました。

以上のように、上記のようなシステム構成の場合、WebサーバのMachine.configでAPサーバへの同時接続数を設定し、APサーバのMachine.configでスレッドプーリング値を設定しチューニングを行わなければならないという事でした。

その他にも、Webサービスの処理時間によっては、クライアント、サーバ両側でIISのチューニング(接続数やタイムアウト値)が必要になることもありました。

皆さんのおかげで、サーバ間の呼出の仕組みが分かりました。本当にありがとうございました。

[ メッセージ編集済み 編集者: ryuuji 編集日時 2004-01-26 09:44 ]
1

スキルアップ/キャリアアップ(JOB@IT)