熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET性能提升秘訣之管道與進程優化

2013-11-13 10:20:03  來源: .NET編程 

  ASPNET 中包涵了很多秘密當你發現它時可以為你的程序帶來更大的性能和擴展性提升例如了解了在Membership和Profile provider提供程序中所隱藏的秘密瓶頸後就可以方便地的解決驗證問題並使得授權操作的速度加快

  另外ASPNET HTTP管道為了避免針對每次請求所要執行的必要代碼而發生阻塞不僅那樣ASPNET工作者進程能夠推動其限制而獲得更高的性能頁面碎片在浏覽器端的輸出緩存(不是在服務器端)可以顯著節約回訪者的下載時間按需求的用戶界面下載可以讓你的站點給人快速流暢的感覺

  最後內容傳輸網絡和HTTP緩存頭的恰當使用可以讓你的網站驚人的快速在這篇文章中你將學習到這些技術它能夠使你的ASPNET應用程序獲得更高的性能更好的擴展性 並且可以在任何ASPNET的網站上實現尤其是那些應用了ASPNET Membership 和Profile provider的站點

  ASPNET管道優化

  位於請求管道中的很多ASPNET默認的HttpModules用於攔截客戶端所發出的每個請求例如SessionStateModule攔截每個請求並解析對應的會話cookie然後在HttpContext中加載適當的會話實時證明並不是所有的modules都是必要的

  例如如果你不使用Membership和Profile provider提供程序那麼你就可以不需要FormsAuthentication module如果你需要為你的用戶使用Windows驗證那麼你就可以不需要WindowsAuthentication位於管道中的這些modules僅僅在每次請求到來時執行一些不必要的代碼

  默認的modules都定義在了nfig文件中(位於$WINDOWS$\MicrosoftNET\Framework\$VERSION$\CONFIG目錄下)

  <httpModules>

  <add name=OutputCache type=SystemWebCachingOutputCacheModule />

  <add name=Session type=SystemWebSessionStateSessionStateModule />

  <add name=WindowsAuthentication

  type=SystemWebSecurityWindowsAuthenticationModule />

  <add name=FormsAuthentication

  type=SystemWebSecurityFormsAuthenticationModule />

  <add name=PassportAuthentication

  type=SystemWebSecurityPassportAuthenticationModule />

  <add name=UrlAuthorization type=SystemWebSecurityUrlAuthorizationModule />

  <add name=FileAuthorization type=SystemWebSecurityFileAuthorizationModule />

  <add name=ErrorHandlerModule type=SystemWebMobileErrorHandlerModule

  SystemWebMobile Version=

  Culture=neutral PublicKeyToken=bfffdaa />

  </httpModules>

  你可以通過在站點的nfig文件中添加<remove>節點到你的網站應用程序中來刪除這些默認的modules例如

  <httpModules><! Remove unnecessary Http Modules for faster pipeline ><remove name=Session /><remove name=WindowsAuthentication /><remove name=PassportAuthentication /><remove name=AnonymousIdentification /><remove name=UrlAuthorization /><remove name=FileAuthorization /></httpModules>

  上面的配置對於使用了數據庫並基於Forms驗證的網站來說非常適合它們並不需要任何會話的支持因此所有這些modules都可以安全的刪除

  ASPNET 進程配置優化

  ASPNET進程模型配置定義了一些進程級別的屬性像ASPNET使用的線程數量超時前阻止線程花費了多長時間多少請求在繼續等待IO工作完成等等默認情況下很多方面都具有太多的限制當今硬件已經變得十分便宜了即使是采用雙核多GB的RAM服務器也變得非常平常的選擇了

  因此進程模型配置能夠減少ASPNET進程消耗更多的系統資源並提供為每台服務器提供更好的擴展性

  執行一次規則的ASPNET安裝將會在nfig文件中創建如下配置的節點

  <systemweb><processModel autoConfig=true />

  你需要減少這種自動配置並針對不同的特性使用一些特定的值以便自定義ASPNET工作者進程的工作方式例如

  <processModel

  enable=true

  timeout=Infinite

  idleTimeout=Infinite

  shutdownTimeout=::

  requestLimit=Infinite

  requestQueueLimit=

  restartQueueLimit=

  memoryLimit=

  webGarden=false

  cpuMask=xffffffff

  userName=machine

  password=AutoGenerate

  logLevel=Errors

  clientConnectedCheck=::

  comAuthenticationLevel=Connect

  comImpersonationLevel=Impersonate

  responseDeadlockInterval=::

  responseRestartDeadlockInterval=::

  autoConfig=false

  maxWorkerThreads=

  maxIoThreads=

  minWorkerThreads=

  minIoThreads=

  serverErrorMessageFile=

  pingFrequency=Infinite

  pingTimeout=Infinite

  asyncOption=

  maxAppDomains=

  />

  除了下面幾個不為默認值以外其余均為系統默認值

  maxWorkerThreads

  每次處理默認為在一台雙核的計算機上ASPNET的處理就需要這意味著ASPNET在一台並行的雙核服務器上可以每次處理個請求我將數量增加到以便為ASPNET的每次處理提供更多的線程如果你有一個應用程序它的CPU處理能力並不是很強但是它卻能夠每秒更容易地處理多個請求那麼你就可以增加這個值

  尤其是你的Web應用程序使用了大量的Web服務調用或者下載/上傳了很多不會對CPU產生壓力的數據時當ASPNET用完這些工作者線程時它會停止出來發來的多個請求此時請求會放置到一個隊列中並持續等待直到出現一個空閒的工作者線程通常到你的站點開始接受超過預期的點擊時會發生這樣的情況那樣的話如果你需要節省CPU的使用可以增加每次處理的工作者線程數來達到目的

  maxIOThreads

  每次處理默認為在一台雙核的計算機上ASPNET進行的I/O操作就需要個線程了這意味著ASPNET在一台並行的雙核服務器上可以每次處理個I/O請求I/O請求能夠進行的文件讀/寫數據庫操作web服務調用從Web 應用程序中產生的HTTP請求等等因此如果你的服務器有足夠的系統資源來處理更多的I/O請求你可以將該值設置為特別是當你的Web應用程序在並行模式下進行下載/上傳數據調用很多外部Web服務時非常有用

  minWorkerThreads

  當空閒的ASPNET工作者線程數量低於這個數字時ASPNET就會開始將這些發來的請求推入隊列中因此你可以為改值設定一個較低的值以便可以增加當前請求的數量此外建議不要將該值設置得過低因為Web應用程序的代碼可能需要做一些後台處理和並行處理此時會需要更多的空閒工作者線程支持

  minIOThreads

  除了它是針對I/O線程以外其它與minWorkerThreads的方式相同然而你可以將該值設置得比minWorkerThreads還低因為就I/O線程而言這裡不會發生並行處理的問題

  memoryLimit

  指定內存大小所允許的最大值作為整個系統內存的百分比以便ASPNET在啟動一個新的進程並重新分派存在的請求之前這些工作者進程能夠進行消費如果在你的服務器上僅僅只運行了你的網站應用程序而且沒有其它的進程需要RAM你可以設置一個更高的值比如

  然而如果你同時有一個會發生內存洩漏的應用程序那麼最好是把該值設置為一個較低的值以便在出現大問題之前洩漏的內存能得到及時的回收從而保持你的站點穩定尤其是當你使用COM組件並發生內存洩漏時然而這只是針對該問題的一個臨時解決方案當然需要你去解決洩漏問題

  除了processModel以外另外還有一個非常重要的節點你能夠指定發出請求作為單獨IP的最大數量

  <><connectionManagement><add address=* maxconnection= /></connectionManagement></>

  默認值為設置得比較低這就意味著你不能從你的Web應用程序用一個IP地址同時鏈接多於個的鏈接站點獲得外部內容很多都是由於默認設置而遭到阻塞這裡我將其設置為如果你的Web應用程序會對某一個指定的服務器進行大量的調用你甚至可以考慮設置一個更高的值


From:http://tw.wingwit.com/Article/program/net/201311/13267.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.