北京北大青鳥學(xué)?偨Y(jié):ASP.NET中優(yōu)化性能的方法(三)

北京北大青鳥學(xué)校學(xué)術(shù)部提供

接上篇文章:ASP.NET中優(yōu)化性能的方法(二)

13. 使請(qǐng)求管線內(nèi)的所有模塊盡可能高效  
請(qǐng)求管線內(nèi)的所有模塊在每次請(qǐng)求中都有機(jī)會(huì)被運(yùn)行。因此,當(dāng)請(qǐng)求進(jìn)入和離開模塊時(shí)快速地觸發(fā)代碼至關(guān)重要,特別是在不使用模塊功能的代碼路徑里。分別在使用及不使用模塊和配置文件時(shí)執(zhí)行吞吐量測(cè)試,對(duì)確定這些方法的執(zhí)行速度非常有用。

14. 使用 HttpServerUtility.Transfer 方法在同一應(yīng)用程序的頁(yè)面間重定向  
采用 Server.Transfer 語(yǔ)法,在頁(yè)面中使用該方法可避免不必要的客戶端重定向。
  
15. 必要時(shí)調(diào)整應(yīng)用程序每個(gè)輔助進(jìn)程的線程數(shù)  
ASP.NET 的請(qǐng)求結(jié)構(gòu)試圖在執(zhí)行請(qǐng)求的線程數(shù)和可用資源之間達(dá)到一種平衡。已知一個(gè)使用足夠 CPU 功率的應(yīng)用程序,該結(jié)構(gòu)將根據(jù)可用于請(qǐng)求的 CPU 功率,來(lái)決定允許同時(shí)執(zhí)行的請(qǐng)求數(shù)。這項(xiàng)技術(shù)稱作線程門控。但是在某些條件下,線程門控算法不是很有效。通過使用與 ASP.NET Applications 性能對(duì)象關(guān)聯(lián)的 Pipeline Instance Count 性能計(jì)數(shù)器,可以在 PerfMon 中監(jiān)視線程門控。當(dāng)頁(yè)面調(diào)用外部資源,如數(shù)據(jù)庫(kù)訪問或 XML Web services 請(qǐng)求時(shí),頁(yè)面請(qǐng)求通常停止并釋放 CPU。如果某個(gè)請(qǐng)求正在等待被處理,并且線程池中有一個(gè)線程是自由的,那么這個(gè)正在等待的請(qǐng)求將開始被處理。遺憾的是,有時(shí)這可能導(dǎo)致 Web 服務(wù)器上存在大量同時(shí)處理的請(qǐng)求和許多正在等待的線程,而它們對(duì)服務(wù)器性能有不利影響。通常,如果門控因子是外部資源的響應(yīng)時(shí)間,則讓過多請(qǐng)求等待資源,對(duì) Web 服務(wù)器的吞吐量并無(wú)幫助。為緩和這種情況,可以通過更改 Machine.config 配置文件節(jié)點(diǎn)的 maxWorkerThreads 和 maxIOThreads 屬性,手動(dòng)設(shè)置進(jìn)程中的線程數(shù)限制。   

北京北大青鳥學(xué)校提醒:輔助線程是用來(lái)處理 ASP.NET 請(qǐng)求的,而 IO 線程則是用于為來(lái)自文件、數(shù)據(jù)庫(kù)或 XML Web services 的數(shù)據(jù)提供服務(wù)的。分配給這些屬性的值是進(jìn)程中每個(gè) CPU 每類線程的最大數(shù)目。對(duì)于雙處理器計(jì)算機(jī),最大數(shù)是設(shè)置值的兩倍。對(duì)于四處理器計(jì)算機(jī),最大值是設(shè)置值的四倍。無(wú)論如何,對(duì)于有四個(gè)或八個(gè) CPU 的計(jì)算機(jī),最好更改默認(rèn)值。對(duì)于有一個(gè)或兩個(gè)處理器的計(jì)算機(jī),默認(rèn)值就可以,但對(duì)于有更多處理器的計(jì)算機(jī)的性能,進(jìn)程中有一百或兩百個(gè)線程則弊大于利。注意進(jìn)程中有太多線程往往會(huì)降低服務(wù)器的速度,因?yàn)轭~外的上下文交換導(dǎo)致操作系統(tǒng)將 CPU 周期花在維護(hù)線程而不是處理請(qǐng)求上。(未完待續(xù),北京北大青鳥學(xué)校提供)  
相關(guān)閱讀:ASP.NET中優(yōu)化性能的方法(一)

北大青鳥網(wǎng)上報(bào)名
北大青鳥招生簡(jiǎn)章