.NET Frameworkを使ってソフトを作っているのですが、System.Threading.ThreadPoolで生成できるスレッドプールは(CPUの個数×25)個までらしい。
そしてSystem.Net.HttpWebRequest.GetResponse()はスレッドプールで実装されている。
…つまり大量にリクエストを投げてタイムアウト待ちの接続が25本以上になると、次のリクエストはすぐに応答が帰ってくると分かっていても、タイムアウト待ちのGetResponse()が帰ってくる前に失敗してしまう。
と、ここまで書いて気がついたが、生成できるスレッドプールは25個でも、それ以上はキューに溜め込まれるってMSDNに書いてあるなぁ。
なぜGetResponse()はキューに入る前に失敗としてしまうのか、それともキューもあふれるほどリクエストを投げすぎなのか。
生成できるスレッドプールは25個でもキューの数は増やせないのか。
などなど、この時期にかなりハイレベルな壁が出現。
maxWorkerThreads属性を変更すると、何とかなるかもしれない。
返信削除$SystemRoot$\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.configの中に設定がある。
これを書き換えたらいいんだろうか。勝手に書き換えて問題ないのかな。
それでも最大値は100らしい。256か最低でも128に設定したいんだけどなぁ。
ソース持って帰ってくればよかった。と思いつつ実証コードを書いてみる。
返信削除…うーん、25本以上リクエストを投げてもエラーにならないなぁ。
やっぱりソフトの実際の動きは、キューがあふれているという状態なのかな。