.NET線程池最大線程數的限制-記一次IIS並發瓶頸


.NET ThreadPool 最大線程數的限制

IIS並發瓶頸,有幾個地方,IIS線程池的最大隊列數,工作進程數,最大並發數。這些這里就不展開。主要是最近因為過度使用Task 導致的線程數占用過多,所以實驗了一下 .net線程池 的限制,分享一下。

注意IIS線程池與.NET線程池不是同一個東西,下面詳解。

 W3 Thread Pool(W3TP)

當處於內核模式的http.sys接收到來自用戶的請求之后,會將請求放入隊列中。那處於用戶模式的w3wp進程如何從內核模式的隊列中取出請求呢?

w3wp中有專門干這個的——w3dt+w3tp

當請求被w3tp通過w3dthttp.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左右,因為我這里的4CPU,所以maxWorkerThreads *CPUCOUNT =80  另外的27條線程可能是IIS線程池里的。

然后當我們同時訪問該站點其他URL時,全部都在一直在等待了。

 

 

 

 OK,重新改為

 

 

maxWorkerThreads =200

這個時候重新啟動站點,運行/home/TestTaskLimitCount 時,看到線程數很快累加到400-500之間,這個時候線程池並沒有被用滿,只是有些Task任務結束后丟回線程池后又被重新啟用。

 

同時再次訪問一下該站點其他URL,發現雖然加載速度稍有緩慢,但是OK沒問題的。

 

 

 這個值(WorkerThreads)最好根據機器性能自行配置,一般100左右,minWorkerThreads 也很重要,因為開啟線程的速度其實還挺慢的,每秒可以開啟幾條而已,所以預先設置好minWorkerThreads可以預防一些突發流量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM