[問題]
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