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