1. 程式人生 > >支援高併發的IIS Web伺服器常用設定--實現10萬個併發請求

支援高併發的IIS Web伺服器常用設定--實現10萬個併發請求

<processModel enable="true" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="50"/>
說明:

我們來看一下ASP.NET中執行緒相關的設定——machine.config中的processModel(位於C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config)。

有4個相關設定:maxWorkerThreads(預設值是20), maxIoThreads(預設值是20), minWorkerThreads(預設值是1), minIoThreads(預設值是1)。(這些設定是針對每個CPU核)

我們用的就是預設設定,由於我們的Web伺服器是8核的,於是實際的maxWorkerThreads是160,實際的maxIoThreads是160,實際的minWorkerThreads是8,實際的minIoThreads是8。

基於這樣的設定,是不是如果瞬間併發請求是169,就會出現排隊?不是的,ASP.NET沒這麼傻!因為CLR 1秒只能建立2個執行緒,等執行緒用完時才建立,黃花菜都涼了。我們猜測ASP.NET只是根據這個設定去預測執行緒池中的可用執行緒是不是緊張,是不是需要建立新的執行緒,以及建立多少執行緒。

那什麼情況下會出現“黑色30秒”期間那樣的大量請求排隊?假如併發請求數平時是300,突然某個瞬間併發請求數是600,超出了ASP.NET預估的所需的可用執行緒數,於是那些拿不到執行緒的請求只能排隊等待正在執行的請求釋放執行緒以及CLR建立新的執行緒。隨著時間的推移,釋放出來的執行緒+新建立的執行緒足以處理這些排隊的請求,就恢復了正常。

那如何驗證這個猜測呢? 修改maxWorkerThreads, maxIoThreads, minWorkerThreads, minIoThreads的設定,讓ASP.NET提供更多的可用執行緒,目前我們採用的設定如下:

<processModel enable="true"  requestQueueLimit="5000" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="50"/>

如果採用這個設定之後,“黑色30秒”現象幾乎不出現,就能驗證問題出在這個地方。現在主站www.cnblogs.com已經使用了這個設定,需要觀察一段時間進行驗證。

===================================================================================================================================================

伺服器最多隻能處理5000個同時請求,今天下午由於某種情況造成同時請求超過5000,從而出現了上面的錯誤。

為了避免這樣的錯誤,我們根據相關文件調整了設定,讓伺服器從設定上支援10萬個併發請求。

具體設定如下:

1. 調整IIS 7應用程式池佇列長度

由原來的預設1000改為65535。

IIS Manager > ApplicationPools > Advanced Settings

Queue Length : 65535

2.  調整IIS 7的appConcurrentRequestLimit設定

由原來的預設5000改為100000。

c:\windows\system32\inetsrv\appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000

在%systemroot%\System32\inetsrv\config\applicationHost.config中可以檢視到該設定:

<serverRuntime appConcurrentRequestLimit="100000"/>

3. 調整machine.config中的processModel>requestQueueLimit的設定

由原來的預設5000改為100000。

<configuration>
    <system.web>
        <processModel enable="true" requestQueueLimit="100000"/>

參考文章:ht

4. 修改登錄檔,調整IIS 7支援的同時TCPIP連線數

由原來的預設5000改為100000。

reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 100000 

5. 執行命令使用設定生效 

net stop http  & net start  http & iisreset 

完成上述4個設定,就可以支援10萬個併發請求