IIS 高並發的相關配置


前言:

  隨着業務量的增加,服務器流量的增長增長了好多,高峰期會出現 503 的錯誤,IIS 對請求數的配置默認是 1000,無法滿足現狀的需求;

  

  需要收集性能數據如下:

  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分鍾)
 1 <!-- 調大應用程序池的請求隊列 -->
 2 C:\Windows\System32\inetsrv>appcmd set apppool webform -queueLength:65535
 3 <!-- 取消固定時間間隔的回收 -->
 4 C:\Windows\System32\inetsrv>appcmd set apppool webform -recycling.periodicRestart.time:00:00:00
 5 <!-- 設置指定時間點的回收 -->
 6 C:\Windows\System32\inetsrv>appcmd set apppool webform /+recycling.periodicRestart.schedule.[value='04:15:00']
 7 <!-- 取消空閑超時的進程關閉 -->
 8 C:\Windows\System32\inetsrv>appcmd set apppool webform -processModel.idleTimeout:00:00:00
 9 <!-- 開啟所有回收事件的日志 -->
10 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"/>

 

 

二、網絡協議

  0、是否是連接數達到了上限,win2008以前的版本,對半開連接數是有限制的,但是從win7、win vista、win2008之后就關閉了該項限制

       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  (干脆直接重啟計算機)

 

  轉載自:

  壓力測試報出503錯誤---ASP.NET支持大並發的相關配置

  雲計算之路-阿里雲上:從ASP.NET線程角度對“黑色30秒”問題的全新分析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM