.NET ThreadPool 最大線程數的限制 IIS併發瓶頸,有幾個地方,IIS線程池的最大隊列數,工作進程數,最大併發數。這些這裡就不展開。主要是最近因為過度使用Task 導致的線程數占用過多,所以實驗了一下 .net線程池 的限制,分享一下。 註意IIS線程池與.NET線程池不是同一個東西, ...
.NET ThreadPool 最大線程數的限制
IIS併發瓶頸,有幾個地方,IIS線程池的最大隊列數,工作進程數,最大併發數。這些這裡就不展開。主要是最近因為過度使用Task 導致的線程數占用過多,所以實驗了一下 .net線程池 的限制,分享一下。
註意IIS線程池與.NET線程池不是同一個東西,下麵詳解。
W3 Thread Pool(W3TP)
當處於內核模式的http.sys接收到來自用戶的請求之後,會將請求放入隊列中。那處於用戶模式的w3wp進程如何從內核模式的隊列中取出請求呢?
w3wp中有專門乾這個的——w3dt+w3tp。
當請求被w3tp通過w3dt從http.sys的隊列中取出來後,接下來的工作就會轉交給ASP.NET,線程池——.NET Thread Pool。
為了檢驗.net 線程池 最大線程數的限制,在MVC中新增一個Action 如下
每個task sleep 1s ,這樣線程池就會被占用最多20W條線程。
設置.net線程池 的配置文件位置
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
64位系統:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
找到這個節點 processModel
設置maxWorkerThreads =20
autoConfig=false (win10預設是true)
訪問地址:/home/TestTaskLimitCount 時
使用工具集 SysinternalsSuite procexp64.exe 查看系統進程的詳細信息
看到W3WP.EXE 這裡的總進程數卡在100左右,因為我這裡的4個CPU,所以maxWorkerThreads *CPUCOUNT =80 另外的27條線程可能是IIS線程池裡的。
然後當我們同時訪問該站點其他URL時,全部都在一直在等待了。
OK,重新改為
maxWorkerThreads =200
這個時候重新啟動站點,運行/home/TestTaskLimitCount 時,看到進程數很快累加到400-500之間,這個時候線程池並沒有被用滿,只是有些Task任務結束後丟回線程池後又被重新啟用。
同時再次訪問一下該站點其他URL,發現雖然載入速度稍有緩慢,但是OK沒問題的。
這個值(WorkerThreads)最好根據機器性能自行配置,一般100左右,minWorkerThreads 也很重要,因為開啟線程的速度其實還挺慢的,每秒可以開啟幾條而已,所以預先設置好minWorkerThreads,可以預防一些突發流量。