項目反饋報出503錯誤,需要收集性能數據如下:
1、Windows性能監視器,該應用程序池進程的線程和處理隊列
2、問題重現時的進程dump
這是請求到達IIS后遇到的第一個隊列,HTTP.sys收到請求后會將請求放入對應的應用程序池隊列,這樣可以減少上下文的切換。需要注意的是應用程序池隊列雖然是給w3wp進程用的,但它存在於http.sys的內存區(http.sys是一個運行於kernel-mode的設備驅動程序)。如果把http.sys比作一塊網卡,那應用程序池隊列相當於網卡的緩沖區。
w3wp從應用程序池隊列中取出請求后,接下來就是從CLR線程池中撈出一個CLR線程處理請求,如果池中空無一線,就會將請求放在CLR線程池隊列中。
檢測兩個隊列的情況,可以使用Windows性能監視器
Http Service Request Queues\CurrentQueueSize
Http Service Request Queues\ArrivalRate
ASP.NET v4.0.30319\Requests Queued
ASP.NET v4.0.30319\Requests Current
應用程序池(Application Pool –> 高級設置 –> 隊列長度)
- General->Queue Length設置為65535(隊列長度所支持的最大值,缺省值為1000)
- Recycling->Regular Time Interval設置為0(取消應用程序池固定時間間隔的自動回收,缺省值為1740)
- Process Model->Idle Time-out設置為0(取消應用程序池因為空閑超時而關閉,缺省值為20分鍾)
<!-- 調大應用程序池的請求隊列 --> C:\Windows\System32\inetsrv>appcmd set apppool webform -queueLength:65535
<!-- 取消固定時間間隔的回收 --> C:\Windows\System32\inetsrv>appcmd set apppool webform -recycling.periodicRestart.time:00:00:00
<!-- 設置指定時間點的回收 --> C:\Windows\System32\inetsrv>appcmd set apppool webform /+recycling.periodicRestart.schedule.[value='04:15:00']
<!-- 取消空閑超時的進程關閉 --> C:\Windows\System32\inetsrv>appcmd set apppool webform -processModel.idleTimeout:00:00:00
<!-- 開啟所有回收事件的日志 --> C:\Windows\System32\inetsrv>appcmd set apppool webform -recycling.logEventOnRecycle:"Time, Requests, Schedule, Memory, IsapiUnhealthy, OnDemand, ConfigChange, PrivateMemory"
IIS (C:\Windows\System32\inetsrv\config\applicationHost.config)
1、設置命令:
c:\windows\system32\inetsrv\appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000
2、設置結果:
<!-- IIS並發請求數 -->
<serverRuntime appConcurrentRequestLimit="100000" />
.NET Framework & ASP.NET (C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config 和 WebAppRoot\web.config)
<!-- .NET Framework 進程模型 配置,最大工作線程(真實的線程數 = 此值 * 邏輯CPU數) -->
<processModel enable="true" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="50" />
<!-- ASP.NET 請求處理隊列 -->
<httpRuntime appRequestQueueLimit="100000"/>
網絡協議
1、將最大連接數設置為10萬
reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 100000
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters /v MaxFieldLength /t REG_DWORD /d 32768 reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters /v MaxRequestBytes /t REG_DWORD /d 32768
2、修改TCP MaxUserPort限制(由默認5000改為65534)
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v MaxUserPort /t REG_DWORD /d 65534
3、 net stop http & net start http & iisreset (干脆直接重啟計算機)