web-dev-qa-db-ja.com

ThreadPoolSetMinThreads-設定の影響

ThreadPool.SetMinthreadsを設定した場合の影響を理解しようとしています。 1つのAzureAppServiceで複数の仮想アプリケーションを実行しています。私の理解では、これらすべての仮想アプリケーションはアプリプールを共有し、ワーカープロセスは1つだけになります(アプリプールの最大ワーカープロセスが1であると想定)。

以下の2つの質問があります。

  1. この設定で、ThreadPool.SetMinThreadsを100個のワーカースレッドとIOスレッド)に設定した場合、各アプリドメインには100個のワーカースレッドと100個のIOロード時のスレッド?正確には、ThreadPool.SetMinThreadsはAppDomain、ワーカープロセス、またはアプリプール内に適用されますか?ThreadPoolのスコープは何ですか?
  2. また、基盤となるホストの容量によって決定されるため、システムが生成できる最大スレッド数に制限はないと思います。つまり、ThreadPool.SetMaxThreadsを明示的に設定しない場合、システムは新しいスレッドを生成し、CPU /メモリが最大に急上昇するまで継続的な負荷がある場合は、それを継続します。私は私の仮定を支持するために以下の声明に基づいています:

たとえば、プロセスとスレッドには物理メモリ、仮想メモリ、プールメモリが必要なため、特定のWindowsシステムで作成できるプロセスまたはスレッドの数は、プロセスの方法に応じて、これらのリソースの1つによって最終的に決定されます。またはスレッドが作成され、どの制約が最初にヒットするか。 https://blogs.technet.Microsoft.com/markrussinovich/2009/07/05/pushing-the-limits-of-windows-processes-and-threads/

12
Thomas

MinThreadsは、生成されるワーカースレッドの数を管理します遅延なしで

スレッドプール(ワーカーまたはIOCPプール)からのスレッドを必要とする何かを行うときはいつでも、システムは最初に空きスレッドがあるかどうかを確認します。

そうでない場合は、現在生成されているスレッドの数を確認します。その数がMinThreadsより小さい場合、すぐに新しいスレッドが生成されます。それ以外の場合は、システムに依存しますが、通常は約300〜500ミリ秒の短い時間待機します。それでも空きスレッドがない場合は、新しいスレッドが生成されます。

もちろん、これはすべてMaxThreadsによって制限されています。

とはいえ、IISは、マシンに基づいて適切な数を把握するのに非常に優れており、ほとんどの場合、そのままにしておくのが最善です。リクエストの処理が心配な場合は、個人的には触れないでください。一方、自分で多くのバックグラウンドタスクを生成している場合は、それが賢明かもしれません。実際に変更を加える前に、測定することを強くお勧めします。

ただし... MinThreadsを100に設定しても、特にシステムは実際に必要な数のスレッドのみを開始するため、害を及ぼすことはめったにありません。

7
Frans