ちょっと処理時間の長いWebサービスを内部で呼び出す、ASP.NET Web アプリを作成することとなった。
ということで、ASP.NET スレッドプールの枯渇がちょっと心配になってきた。
心配のもとは、MSDN Magazine のこちらの記事。
http://msdn.microsoft.com/ja-jp/magazine/cc163463.aspx
ということで、自分の手元で、"スレッドプールの枯渇が原因で Server too busy を再現" してみることにした。
これが再現できれば、ASP.NET 非同期ページを実装したときにも、その実装が正しいことが確認できると思ったからだ。
ところが、これがけっこう大変。
ということで、その顛末を書いてみる。
まずは、同時間帯の多量のWeb要求を再現しなくてはならない。
ということで、手始めに下記記事などで紹介されているような一般に入手できるストレスツールを使わずに、自前の C# コンソールアプリによる同時アクセスを試してみることにした。
http://www.microsoft.com/japan/msdn/columns/server/server092799.aspx
"同時" でなくてはならないので、マルチスレッド、ないしは、非同期な機能を使ってWeb要求を送りこまなくてはいけない。
System.Net.WebClient を使い、
DownloadStringAsync メソッドを繰り返し呼び出す実装を試してみた。
ところが、Webサーバー側には、常に同時期に2要求ずつしか着信しない。
「WebClient 同時接続」のキーワードで Google 検索してみたところ、検索結果の第一位に@IT の下記の記事がヒット。
http://www.atmarkit.co.jp/fdotnet/dotnettips/619maxconnum/maxconnum.html
なるほど、
ServicePointManager.DefaultConnectionLimit プロパティ が既定で 2 だからなのですね。
ServicePointManager.DefaultConnectionLimit プロパティを明示的に "10" とかに設定することにより、同時期のWeb要求送信数を増やすことができるようになった。
しかし、これは長い道のりの第一歩に過ぎなかった。