Asp.net

與正常 CLR 執行緒相比,為什麼 IIS 執行緒如此珍貴?

  • September 6, 2012

我正在閱讀ASP.NET MVC 中的 AsyncControllers。

似乎它們存在的唯一原因是可以保存 IIS 執行緒,而將長時間執行的工作委託給正常 CLR 執行緒,這似乎更便宜。

我在這裡有幾個問題:

  • 為什麼這些 IIS 執行緒如此昂貴,以證明為支持非同步控制器而建構的整個體系結構是合理的?
  • 我如何知道/配置在我的 IIS 應用程序池中執行了多少個 IIS 執行緒?

ASP.NET 使用 .NET 執行緒池中的執行緒處理請求。執行緒池維護一個已經產生執行緒初始化成本的執行緒池。因此,這些執行緒很容易重用。.NET 執行緒池也是自我調整的。它監控 CPU 和其他資源使用率,並根據需要添加新執行緒或修剪執行緒池大小。您通常應該避免手動創建執行緒來執行工作。相反,使用執行緒池中的執行緒。同時,重要的是要確保您的應用程序不會執行冗長的阻塞操作,這些操作可能會很快導致執行緒池不足和拒絕 HTTP 請求。

磁碟 I/O、Web 服務呼叫都阻塞了。最好通過使用非同步呼叫進行優化。當您進行非同步呼叫時,asp.net 會釋放您的執行緒,並在呼叫回調函式時將請求分配給另一個執行緒。

要配置您可以設置的執行緒數:

<system.web>
   <applicationPool maxConcurrentRequestsPerCPU="50" maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000"/>
</system.web>

請參閱:IIS 7.5、IIS 7.0 和 IIS 6.0 上的 ASP.NET 執行緒使用

這些是Microsoft 最佳實踐推薦的設置:

  • 將 maxconnection 設置為 12 * # of CPUs。此設置控制您可以從客戶端發起的最大傳出 HTTP 連接數。在這種情況下,ASP.NET 是客戶端。將 maxconnection 設置為 12 * # of CPUs。
  • 將 maxIoThreads 設置為 100。此設置控制 .NET 執行緒池中的最大 I/O 執行緒數。這個數字會自動乘以可用 CPU 的數量。將 maxloThreads 設置為 100。
  • 將 maxWorkerThreads 設置為 100。此設置控制執行緒池中的最大工作執行緒數。然後,此數字會自動乘以可用 CPU 的數量。將 maxWorkerThreads 設置為 100。
  • 將 minFreeThreads 設置為 88 * # of CPUs。如果執行緒池中的可用執行緒數低於此設置的值,則工作程序使用此設置對所有傳入請求進行排隊。此設置有效地將可以同時執行的請求數限制為 maxWorkerThreads - minFreeThreads。將 minFreeThreads 設置為 88 * # of CPUs。這將並發請求的數量限制為 12(假設 maxWorkerThreads 為 100)。
  • 將 minLocalRequestFreeThreads 設置為 76 * # of CPUs。如果執行緒池中可用執行緒的數量低於此數量,則工作程序使用此設置對來自 localhost(Web 應用程序將請求發送到本地 Web 服務)的請求進行排隊。此設置類似於 minFreeThreads 但它僅適用於來自本地電腦的 localhost 請求。將 minLocalRequestFreeThreads 設置為 76 * # of CPUs。

注意:本節中提供的建議不是規則。他們是一個起點。

您必須對您的應用程序進行基準測試,以找到最適合您的應用程序的方法。

引用自:https://stackoverflow.com/questions/12304691