ASP.NET中性能和擴展性的秘密
ASP.NET有許多一旦你發現了就會大幅提高性能和擴展性的秘密。比如:在membership和Profile provider 中就有快速實現驗證和授權的秘密。此外:ASP.NET的http管道可以避免每個請求中的不必要代碼。還不只是這些,ASP.NET的線程可以充分發揮性能。瀏覽器的頁面片斷緩存機制(不是服務器緩存)可以在反復的訪問中節約下載時間。在界面加載完成后給你的網站提供快速流暢的體驗。最后,CDN和適當的使用http緩存頭可以使你的網站訪問飛快。這篇文章中,你可以學到一些提高你的ASP.NET網站性能的技巧。
我們要討論的問題:
◆管線最佳優化
◆ASP.NET過程最佳處理
◆進行之前要對ASP.NET做的事情
◆內容傳送網絡
◆在瀏覽器中緩存AJAX請求
◆優化緩存機制
◆優化頁面裝載速度提高用戶體驗
◆盡可能的優化ASP.NET 2.0的profile provider.
◆在不布置網站的情況下如何查詢membership表
◆DOS攻擊
以上技巧可用于任何基于ASP.NET的網站,尤其是使用了membership和profile provider的網站。
1.管線最佳優化
一些ASP.NET默認的HttpModules 管理請求的管線并且每一個請求。例如:SessionStateModule攔截每一個請求,分析session cookie 來加載HttpContext中的合適的session.但是并不是所有的Modules都是必需的,比如:如果你不用membership的話,就不用配置FormsAuthentication模塊;如果你不用windows身份驗證就不用配置WindowsAuthentication,這些模塊只是包含在管線里面,為每一個請求執行一些并不是必須的代碼。默認的模塊定義在machine.config中($WINDOWS$\Microsoft.NET\Framework\$VERSION$\CONFIG)
如下所示:
|
如果你想去掉這些默認的設置,只需要在你的web.config里加入
|
上面的配置適用于基于數據庫的form認證并且不需要任何session支持的網站。所以這些節點可以被刪除。
2.ASP.NET進程配置優化
asp.net進程模型進行一些進程級別設置,比如ASP.NET使用多少線程,超時時間,多少請求等待輸入輸出工作的完成等等。默認情況下有很多限制。現在硬件越來越便宜,G級內存的服務器普遍存在,所以現在進程配置的優化可以得到更多的系統資源和擴展。
一般情況下,ASP.NET的mashine.config的配置是這樣的:
|
你應該改變這樣的配置,用一些值設置不同的屬性來定制ASP.NET線程的工作方式。如下所示:
|
除了下面的值外都是一些默認值:
maxWorkerThreads:默認每個進程是20個線程。在雙核的服務器上,系統會分配40個線程給ASP.NET,這就意味著ASP.NET在雙核服務器上同時可以處理40個并發請求。為了給ASP.NET的每個進程增加線程,我曾經設置過100.如果你的應用的CPU強勁而且有更多的請求需要,你可以設置這個屬性。特別是你的網絡就用使用了大量的webservice或者上傳/下載大量數據這些不會把壓力轉到CPU上的時候。當ASP.NET用完了所有的線程,它會停止接收更多的響應。請求會排成隊列等待直到其它工作中的線程被釋放。這種情況經常發生在網站接收到超出預期的點擊的時候,這種情況下,如果你有備用的CPU,請增加進程的線程數量。
maxIOThreads:默認是20個。雙核服務器中系統會提供40個I/O線程給ASP.NET.I/O請求可以用于網站的文件讀寫,數據庫讀取,webservice調用,http請求等等。你可以把它設置的更高一點,特別是在你的網站做并發的上傳/下載和 webservice調用的時候。
minWorkerThreads:當ASP.NET自由工作線程低于這個值時,ASP.NET會推送一些請求進入隊列。所以你可以設置一個低值來增加當前的請求數量。當然這個值不能設置的太低,因為網站要做一些后臺處理和并行處理,這些工作都是需要一些線程來運行的。
minIOThreads:和minWorkerThreads相當,只不過是針對I/O進程進行的設置。它可以設置的比in case of 低,因為I/O并行處理線程沒有什么問題。
memoryLimit:指定最大的內存使用大小。它指定的是占所有系統內存的百分比,是指定系統處理進程時可以使用的最大內存數。如果服務器上只有你自己的網站而且沒有其它的使用內存的進程,你可以把它設置的高一些,比如:80.如果你的網站存在內存泄露問題,你最好把這個值設置的低一點,這樣泄露的內存不久就會釋放出來,這樣會保持網站的正常運行。特別是你在使用COM組件造成內存泄露的時候。當然這只是個臨時方案,最終你還是要解決這個內存泄露的問題。
除了processModel之外,ASP.NET還可以設置單一IP最大的請求數量:
|
默認是2,這個值太低了。這意味著每一個IP最多只能有兩個請求到你的網站,這樣會造成請求擁堵。這里設置成了100,當然有必要的話,你可以設置得更高。
【編輯推薦】