[.NET] .NET IIS Performance : 同一時間 大量連線問題

[問題]
asp.net 應用程式,同一時間大量存取,e.g 搶票系統
由於macine.config 預設minFreeThread 只有8 ,當大量request進來時,iis來不及因應
故會造成程式執行緩慢

[背景]
Configuration setting Default value  Recommended value

maxconnection 2 12 * #CPUs
maxIoThreads 20 100
maxWorkerThreads 20 100
minFreeThreads 8 88 * #CPUs
minLocalRequestFreeThreads 4 76 * #CPUs

   

[解決方法]
1.修改machine.config
.net 2.0位置
C:\Windows\Microsoft.NET\Framework\v2.0.50727\Config
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Config    
.net 4.0位置  
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config  

若集區有啟用32位元應用程式,則以上32位元與64位元位置的machine.config均要修改

2.以下以CPU數=4 為例
processModel:預設AutoConfig=true ,請改為自行設定,maxWorkerThreads=100,minWorkerthread=100/2 = 50
httpRuntime  :  minFreethreads=88*CPU數, minLocalRequestFreeThreads=76*CPU數
maxConnection: 12*CPU數

machine.config

<system.web>
    <processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
    <httpRuntime minFreeThreads="352" minLocalRequestFreeThreads="302"/>
</system.web>

<system.net>
    <connectionManagement>
        <add address="*" maxconnection="48"/>
    </connectionManagement>
</system.net>

 

[實驗結果]
1.搶票壓測程式,亂數產生一組訂票紀錄(包含主要資料庫IO 查詢及訂票)
2.一個連線數: 0.2 sec
3.修改設定前:壓測程式同時發起600連線數:avg 30~50 sec/per reqeust  ,造成程式緩慢 甚至Timeout
4.修改設定後:壓測程式同時600連線數:avg 6~10 sec/per request
5.減少執行時間約80%

[小記]
1.壓測程式須設定以下屬性,否則無法發起大量連線
 ServicePointManager.DefaultConnectionLimit = 1000
2.原本這是之前.net 2.0遇到的問題,沒想到於.net 4.0一樣發生

[ 參考資料]
Blogs
ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0  by Thomas L. Marquardt
http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

官方
Contention, poor performance, and deadlocks when you make calls to Web services from an ASP.NET application
https://support.microsoft.com/zh-tw/kb/821268