asp.net2.0有許多一旦你發(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 2.0的網(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)
如下所示:
<httpModules>
<add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" />
<add name="WindowsAuthentication"
type="System.Web.Security.WindowsAuthenticationModule" />
<add name="FormsAuthentication"
type="System.Web.Security.FormsAuthenticationModule" />
<add name="PassportAuthentication"
type="System.Web.Security.PassportAuthenticationModule" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"/>
<add name="FileAuthorization"type="System.Web.Security.FileAuthorizationModule" />
<add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule,
System.Web.Mobile, Version=1.0.5000.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</httpModules>
如果你想去掉這些默認(rèn)的設(shè)置,只需要在你的web.config里加入<remove>節(jié)點(diǎn)。
<httpModules>
-->
<remove name="Session" />
<remove name="WindowsAuthentication" />
<remove name="PassportAuthentication" />
<remove name="AnonymousIdentification" />
<remove name="UrlAuthorization" />
<remove name="FileAuthorization" />
</httpModules>
上面的配置適用于基于數(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)情況下有很多限制?,F(xiàn)在硬件越來越便宜,G級內(nèi)存的服務(wù)器普遍存在,所以現(xiàn)在進(jìn)程配置的優(yōu)化可以得到更多的系統(tǒng)資源和擴(kuò)展。
一般情況下,asp.net的mashine.config的配置是這樣的:
<system.web>
<processModel autoConfig="true" />
</system.web>
你應(yīng)該改變這樣的配置,用一些值設(shè)置不同的屬性來定制asp.net線程的工作方式。如下所示:
<processModel
enable="true"
timeout="Infinite"
idleTimeout="Infinite"
shutdownTimeout="00:00:05"
requestLimit="Infinite"
requestQueueLimit="5000"
restartQueueLimit="10"
memoryLimit="60"
webGarden="false"
cpuMask="0xffffffff"
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"
asyncOption="20"
maxAppDomains="2000"
/>
除了下面的值外都是一些默認(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,請增加進(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ù)量:
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
默認(rèn)是2,這個值太低了。這意味著每一個IP最多只能有兩個請求到你的網(wǎng)站,這樣會造成請求擁堵。這里設(shè)置成了100,當(dāng)然有必要的話,你可以設(shè)置得更高。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。