1月 27, 2006

「ツヨイカベ」ガ、アラワレタ

.NET Frameworkを使ってソフトを作っているのですが、System.Threading.ThreadPoolで生成できるスレッドプールは(CPUの個数×25)個までらしい。
そしてSystem.Net.HttpWebRequest.GetResponse()はスレッドプールで実装されている。
…つまり大量にリクエストを投げてタイムアウト待ちの接続が25本以上になると、次のリクエストはすぐに応答が帰ってくると分かっていても、タイムアウト待ちのGetResponse()が帰ってくる前に失敗してしまう。
と、ここまで書いて気がついたが、生成できるスレッドプールは25個でも、それ以上はキューに溜め込まれるってMSDNに書いてあるなぁ。
なぜGetResponse()はキューに入る前に失敗としてしまうのか、それともキューもあふれるほどリクエストを投げすぎなのか。
生成できるスレッドプールは25個でもキューの数は増やせないのか。
などなど、この時期にかなりハイレベルな壁が出現。

2 件のコメント:

  1. maxWorkerThreads属性を変更すると、何とかなるかもしれない。
    $SystemRoot$\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.configの中に設定がある。
    これを書き換えたらいいんだろうか。勝手に書き換えて問題ないのかな。
    それでも最大値は100らしい。256か最低でも128に設定したいんだけどなぁ。

    返信削除
  2. ソース持って帰ってくればよかった。と思いつつ実証コードを書いてみる。
    …うーん、25本以上リクエストを投げてもエラーにならないなぁ。
    やっぱりソフトの実際の動きは、キューがあふれているという状態なのかな。

    返信削除