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

.NET ThreadPool 最大線程數的限制

IIS併發瓶頸,有幾個地方,IIS線程池的最大隊列數,工做進程數,最大併發數。這些這裏就不展開。主要是最近由於過分使用Task 致使的線程數佔用過多,因此實驗了一下 .net線程池 的限制,分享一下。併發

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

 W3 Thread Pool(W3TP)

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

w3wp中有專門幹這個的——w3dt+w3tpui

當請求被w3tp經過w3dthttp.sys的隊列中取出來後,接下來的工做就會轉交給ASP.NET線程池——.NET Thread Poolspa

 爲了檢驗.net 線程池 最大線程數的限制,在MVC中新增一個Action 以下.net

 

 每一個task sleep 1s ,這樣線程池就會被佔用最多20W條線程。線程

 

 設置.net線程池 的配置文件位置3d

 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.configblog

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能夠預防一些突發流量。

相關文章
相關標籤/搜索