IIS併發瓶頸,有幾個地方,IIS線程池的最大隊列數,工做進程數,最大併發數。這些這裏就不展開。主要是最近由於過分使用Task 致使的線程數佔用過多,因此實驗了一下 .net線程池 的限制,分享一下。併發
注意IIS線程池與.NET線程池不是同一個東西,下面詳解。工具
當處於內核模式的http.sys接收到來自用戶的請求以後,會將請求放入隊列中。那處於用戶模式的w3wp進程如何從內核模式的隊列中取出請求呢?性能
w3wp中有專門幹這個的——w3dt+w3tp。ui
當請求被w3tp經過w3dt從http.sys的隊列中取出來後,接下來的工做就會轉交給ASP.NET,線程池——.NET Thread Pool。spa
爲了檢驗.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左右,由於我這裏的4個CPU,因此maxWorkerThreads *CPUCOUNT =80 另外的27條線程多是IIS線程池裏的。
而後當咱們同時訪問該站點其餘URL時,所有都在一直在等待了。
OK,從新改成
maxWorkerThreads =200
這個時候從新啓動站點,運行/home/TestTaskLimitCount 時,看到線程數很快累加到400-500之間,這個時候線程池並無被用滿,只是有些Task任務結束後丟回線程池後又被從新啓用。
同時再次訪問一下該站點其餘URL,發現雖然加載速度稍有緩慢,可是OK沒問題的。
這個值(WorkerThreads)最好根據機器性能自行配置,通常100左右,minWorkerThreads 也很重要,由於開啓線程的速度其實還挺慢的,每秒能夠開啓幾條而已,因此預先設置好minWorkerThreads,能夠預防一些突發流量。