3

我想了解設置ThreadPool.SetMinthreads的影響。我有一個Azure應用服務中運行多個虛擬應用程序。我的理解是,所有這些虛擬應用程序將共享應用程序池,並將只有一個工作進程(假設應用程序池的最大工作進程將爲1)。ThreadPool SetMinThreads - 設置它的影響

我有以下兩個問題。

  1. 在此設置中,如果設置了ThreadPool.SetMinThreads讓我們說100個工作線程和IO線程,可我安全地假定每個應用程序域將有100個工作線程和100個IO線程加載時?確切地說,ThreadPool.SetMinThreads適用於AppDomain或工作進程或應用程序池? ThreadPool的範圍是什麼?
  2. 我還假設系統可以產生的最大線程數沒有限制,因爲它是由底層主機的容量決定的。這意味着,如果我沒有明確設置ThreadPool.SetMaxThreads,則系統將產生新線程,並且如果持續加載直到CPU /內存達到最大值,系統將繼續執行此操作。我立足於下面的語句來支持我的假設:

進程和線程,例如,需要物理內存,虛擬 內存,池內存,這樣的進程或線程 可數在給定的Windows系統上創建最終由 其中一個資源決定,具體取決於創建進程或線程的方式以及首先命中哪個約束。 https://blogs.technet.microsoft.com/markrussinovich/2009/07/05/pushing-the-limits-of-windows-processes-and-threads/

+0

你爲什麼要改變它,它實際需要反正線程數?幾乎沒有必要改變線程池中的最小線程數。 Msoft花了很多時間使線程池行爲最優化 - 你爲什麼不同? (編輯 - 不是說你錯了,只是說可能有另一個解決方案) – mikelegg

+0

當你在這個有大量併發用戶的系統上運行性能測試時,min線程會產生影響。錯誤數和響應時間與線程數有關 – Thomas

回答

2

的MinThreads支配多少工作線程沒有延遲將催生

無論何時您需要線程池中的某個線程(無論是worker還是IOCP池),系統都會首先查看是否有空閒線程。

如果不是,它會查看當前產生了多少個線程。如果該數字小於MinThreads,它立即產生一個新的線程。否則,它會等待很短的時間,通常在300-500ms左右,儘管這取決於系統。如果仍然沒有空閒線程,它會產生一個新的線程。

如果當然,這仍然受到MaxThreads的限制。所有這一切說,IIS非常善於根據您的機器計算出一個合理的數字,並且在大多數情況下,您最好不要管它;如果你只是擔心服務請求,那麼我不會親自觸摸它。另一方面,如果你自己產生了大量的後臺任務,那麼這可能是明智的。我強烈建議您在實際進行更改之前對其進行衡量。

雖然... MinThreads設置爲100很少是有害的,尤其是在系統纔會開始