.NET線程池最大線程數的限制-記一次IIS並發瓶頸
https://www.cnblogs.com/7rhythm/p/9964543.html
.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,可以預防一些突發流量。
<processModel autoConfig="true"/>
修改
<processModel autoConfig="false" maxWorkerThreads="200" minWorkerThreads="100" requestQueueLimit="100000"/>
修改windows服務器注冊表中TCP連接限制,可達到10萬連接請求,大內存情況下。