ASP.NET工作者進程能夠推動其限制而獲得更高的效能。在 Internet 資訊服務 (IIS) Web 服務器上配置 ASP.NET 進程模型設定。只能在 Machine.config 檔案中設定 <processModel> 節,並且該節影響伺服器上啟動並執行所有 ASP.NET 應用程式。 可以參考文檔說明:http://doc.51windows.net/iismmc/?url=/iismmc/htm/aaconprocessmodelelement.htm。
ASP.NET進程模型配置定義了一些進程層級的屬性,像ASP.NET使用的線程數量、逾時前阻止線程花費了多長時間、多少請求在繼續等待IO工作完成等等。預設情況下,很多方面都具有太多的限制。現在我們使用的硬體都是採用雙核多GB的RAM伺服器,因此,進程模型配置能夠減少ASP.NET進程消耗更多的系統資源並提供為每台伺服器提供更好的擴充性。
ASP.NET 2.0 安裝將會在machine.config檔案中建立如下配置的節點:
<system.web>
<processModel autoConfig="true" />
需要減少這種自動設定並針對不同的特性使用一些特定的值以便自訂ASP.NET工作者進程的工作方式。例如:
<processModel
enable="true"
timeout="Infinite"
idleTimeout="Infinite"
shutdownTimeout="00:00:05"
requestLimit="Infinite"
requestQueueLimit="5000"
restartQueueLimit="10"
memoryLimit="60"
webGarden="false"
userName="machine"
password="AutoGenerate"
logLevel="Errors"
clientConnectedCheck="00:00:05"
comAuthenticationLevel="Connect"
comImpersonationLevel="Impersonate"
responseDeadlockInterval="00:03:00"
responseRestartDeadlockInterval="00:03:00"
autoConfig="false"
maxWorkerThreads="100"
maxIoThreads="100"
minWorkerThreads="40"
minIoThreads="30"
serverErrorMessageFile=""
pingFrequency="Infinite"
pingTimeout="Infinite"
maxAppDomains="2000"
/>
除了下面幾個不為預設值以外,其餘均為系統預設值:
maxWorkerThreads
每次處理預設為20,在一台雙核的電腦上,ASP.NET的處理就需要40了。這意味著ASP.NET在一台並行的雙核伺服器上可以每次處理40個請求。我將數量增加到100以便為ASP.NET的每次處理提供更多的線程。如果你有一個應用程式,它的CPU處理能力並不是很強但是它卻能夠每秒更容易地處理多個請求,那麼你就可以增加這個值。
尤其是你的Web應用程式使用了大量的Web服務調用或者下載/上傳了很多不會對CPU產生壓力的資料時。當ASP.NET用完這些工作者線程時,它會停止出來發來的多個請求。此時請求會放置到一個隊列中並持續等待直到出現一個閒置工作者線程。通常到你的網站開始接受超過預期的點擊時會發生這樣的情況。那樣的話,如果你需要節省CPU的使用,可以增加每次處理的工作者線程數來達到目的。
maxIOThreads
每次處理預設為20,在一台雙核的電腦上,ASP.NET進行的I/O操作就需要40個線程了。這意味著ASP.NET在一台並行的雙核伺服器上可以每次處理40個I/O請求。I/O請求能夠進行的檔案讀/寫、資料庫操作、web服務調用、從Web 應用程式中產生的HTTP請求等等。因此,如果你的伺服器有足夠的系統資源來處理更多的I/O請求,你可以將該值設定為100。特別是當你的Web應用程式在並行模式下進行下載/上傳資料、調用很多外部Web服務時,非常有用。
minWorkerThreads
當閒置ASP.NET工作者線程數量低於這個數字時,ASP.NET就會開始將這些發來的請求推入隊列中。因此,你可以為改值設定一個較低的值以便可以增加當前請求的數量。此外,建議不要將該值設定得過低,因為Web應用程式的代碼可能需要做一些幕後處理和平行處理,此時會需要更多的空閑工作者線程支援。
minIOThreads
除了它是針對I/O線程以外,其它與minWorkerThreads的方式相同。然而你可以將該值設定得比minWorkerThreads還低。因為就I/O線程而言,這裡不會發生平行處理的問題。
memoryLimit
指定記憶體大小所允許的最大值,作為整個系統記憶體的百分比,以便ASP.NET在啟動一個新的進程並重新指派存在的請求之前這些工作者進程能夠進行消費。如果在你的伺服器上僅僅只運行了你的網站應用程式程式,而且沒有其它的進程需要RAM,你可以設定一個更高的值,比如80。
然而,如果你同時有一個會發生記憶體流失的應用程式,那麼最好是把該值設定為一個較低的值以便在出現大問題之前泄漏的記憶體能得到及時的回收從而保持你的網站穩定。尤其是當你使用COM組件並發生記憶體流失時。然而,這隻是針對該問題的一個臨時解決方案;當然需要你去解決泄漏問題。
除了processModel以外,另外還有一個非常重要的節點system.net,你能夠指定發出請求作為單獨IP的最大數量。
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
預設值為2,設定得比較低。這就意味著你不能從你的Web應用程式用一個IP地址同時連結多於2個的連結。網站獲得外部內容很多都是由於預設設定而遭到阻塞。這裡我將其設定為100。如果你的Web應用程式會對某一個指定的伺服器進行大量的調用,你甚至可以考慮設定一個更高的值。