2011-02-05 21 views
9

私は自分のアプリケーションにlog4netを追加しました。そして、ユーザーアクティビティのスレッドIDが私のウェブサイトをナビゲートする際に表示されるようになりました。スレッド割り当てがIIS7でどのように行われるかについての具体的なアルゴリズムはありますか?それとも、ランダムな番号割り当てですか?(私のトラフィックが少ないサイトでスレッドの大部分が10-30の範囲にあるため完全にランダムではないと思われます。使用可能なスレッド数の最大値はどれですか?私のスケジューラには奇妙なスレッドIDが表示されることに気付きました。これには何らかの理由がありますか?スケジューラーはQuartz.netで、IDだけではなく、 "Scheduler_Worker-10"と表示されます。IIS7スレッドはどのように割り当てられますか?

+0

私は接続ごとに少なくとも1つのスレッドが割り当てられていると考えています(接続を受け入れ、グローバルアプリケーション状態を管理するなど)。私はこれを答えとして掲示しているわけではありません。 – IDWMaster

+2

http://stackoverflow.com/questions/4839657/how-are-threads-tied-to-requests-through-http-sys-iis-and-asp-netを参照してください。 –

答えて

8

Thisは、知っておくべきことをすべて説明しています。

アン抜粋:ASP.NETが 統合モードでIIS 7.0でホストされている場合は

、スレッドの使用は 少し異なっています。まず、アプリケーションレベルのキューである はもう存在しません。 彼らのパフォーマンスはいつも本当に 悪かった、これを修正することに希望がなかったので、 と私たちはそれらを取り除いた。しかし、おそらく 最大の違いは、IIS 6.0、またはISAPIモードでは、ASP.NETが同時に 実行要求をスレッド数を制限しますが、IIS 7.0 統合モードでは、ASP.NETが同時に 要求を実行する 数を制限していることです。この相違点は、要求が非同期の (要求が 非同期ハンドラまたはパイプ のモジュールが非同期で を完了した)の場合にのみ、 に関係します。 reqeustsが同期している場合は明らかに、そして同時に 要求を実行する 数は スレッドの数が同時に リクエストを実行するのと同じですが、要求は 非同期である場合は、可能性として、これら二つの数字 はかなり異なる場合があります はスレッドよりもはるかに多くの要求があります。

したがって、基本的に、要求が同期している場合、要求ごとに同じ数のスレッドがあります。さまざまなparametersについてはこちらをご覧ください。

4

私はこれがあなたの質問と一致するが、私はIISが要求を処理する方法を説明し、私はあなたがあなたの答えがあるでしょうとは考えていないタイトル私のブログ ASP.NET Performance-Instantiating Business Layers

上のブログの記事で説明してきました。

記事からの引用

IISはそれが ワーカープロセスにそれを上に渡し、あなたの アプリケーションの要求をフィールド。 のワーカープロセスでは、 グローバルクラス( HttpApplication)のインスタンスとインスタンスが作成され、インスタンス化されます。その時点から には、ASP.NET アプリケーションの一般的なフローが発生します(ASP.NET パイプライン)。しかし、あなたが に必要なものを知っていると理解し、ワーカー プロセス(実際にはIISと考える) が 他の要求をフィールドにするために、あなたの のHttpApplication(あなた グローバルクラスのインスタンス)生きているのインスタンスを保持していることです。実際には、デフォルト でそれが作成しと 必要(レイジーのインスタンス化) が負荷にあなたのウェブサイトは、他の 要因を受け 要求の数を依存している場合、あなたの世界クラスの10個の インスタンスまでキャッシュします。上の図1では、 というASP.NETアプリケーションのインスタンス が赤いボックスとして表示されています。そこには によってキャッシュされたこれらのうち最大10個がワーカープロセスになる可能性があります。これらは実際には スレッドで、ワーカープロセスには が作成され、キャッシュされ、各スレッドにはグローバルクラスの独自のインスタンス があります。 これらのスレッドはそれぞれ、同じアプリケーションドメインの にあることに注意してください。したがって、 アプリケーションで使用する静的な クラスは、 の各スレッドまたはアプリケーション インスタンスで共有されます。

あなたがその記事を読むことをお勧めします。質問があればお答えします。私は意図的に記事を単純にしておきました。カーネルで何が起こるかについて話をしたり、参加しているさまざまなコンポーネントの詳細を調べたりしません。それを単純にすることは、人々が概念をもっとよく理解するのに役立ちます(私は感じます)。

私はここにあなたの他の質問の一部にお答えします:

  1. は、スレッドの割り当ては、IIS7で発生方法に任意の特定のアルゴリズムはありますか?

いいえ、すべての目的で、ランダムです。これは私が指摘した記事で説明されています。短い答えは、キャッシュされたスレッドが利用可能であれば、IIsはそれを使用するということです。そうでない場合は、新しいスレッドを作成し、HttpApplication(Global)のインスタンスとインスタンスを作成し、すべてのコンテキストを割り当てます。したがって、ビジー状態でないサイトでは、同じスレッドが要求を処理することがあります。しかし、保証はありません。空きスレッドが2つ以上ある場合、IISはランダムにスレッドを選択してその要求を処理します。あなたの要求が長い時間がかかる場合は、忙しいサイトでも、IISは他の着信要求を処理するために新しいスレッドを作成するように強制されます。

  1. 利用可能なスレッド数には上限がありますか?

通常、ワーカープロセスあたり10スレッドです(この記事で説明しています)。これは調整することができますが、私は非常に忙しいウェブサイトの数に取り組んだことがありませんでした。重要な点は、アプリケーションをできるだけ早く応答させることです。アプリケーションに複数のワーカープロセスを割り当てることができます(アプリケーションプール内で設定されている)ので、実際には複数のワーカープロセスがアプリケーションに必要なビジー状態のサイトでは、必要なハードウェア(CPUコアとメモリ)が必要です。

  1. スケジューラはQuartz.netあり、IDが「Scheduler_Worker-10」として示すだけでなく数

スレッドではなくIDの名前を持つことができます。スレッドに名前が割り当てられている場合は、idの代わりにその名前が表示されます。もちろん、スレッド用のIISでは、このような制御はありません。私はそれを知らないので、私は使っていません(Quartzについても知っているわけではありませんが、私はそれが当てはまると思います)。

関連する問題