效能的設計和組態

更新:2007 年 11 月

這個主題會討論改善 Web 應用程式效能可用的設計、組態、編譯和記憶體選項。

非同步程式撰寫模型

ASP.NET 支援一些非同步的 (Asynchronous) 程式設計技術,可讓您將資料庫查詢等長時間執行的工作移至與主應用程式執行緒分開執行的執行緒。您可使用下列技術:

  • BackgroundWorker元件System.ComponentModel 命名空間中的 BackgroundWorker 類別 (Class) 可讓您將耗時工作的程式碼加入至 DoWork 事件處理常式並呼叫 RunWorkerAsync 方法來引發 DoWork 事件。呼叫的執行緒會繼續執行,而背景工作方法則會以非同步方式執行。當此方法完成後,BackgroundWorker 元件就會透過引發 RunWorkerCompleted 事件來警示呼叫的執行緒。如需詳細資訊,請參閱 BackgroundWorker 元件

  • 事件架構非同步程式設計:事件架構非同步模式可能會採用數種形式,端視特定類別所支援作業的複雜度而定。最簡單的類別可以有單一的 MethodNameAsync 方法和對應的 MethodNameCompleted 事件。比較複雜的類別則可以有數個 MethodNameAsync 方法,每一個都有對應的 MethodNameCompleted 事件,以及這些方法的同步版本。這些類別可以選擇性地支援取消、進度報告,以及每個非同步方法的累加結果。

    非同步方法也可以支援多次暫止呼叫 (多個並行引動過程),讓您的程式碼能在完成其他暫止作業之前,對這種方法呼叫任意次數。要正確地處理這種情況,您的應用程式可能需要追蹤每個作業的完成。

    如需此模式及其實作 (Implementation) 的完整說明,請參閱事件架構非同步模式概觀

  • 使用 IAsyncResult 的非同步程式設計:使用 IAsyncResult 設計模式的非同步作業是實作為兩個名為 BeginOperationName 和 EndOperationName 的方法,分別開始及結束非同步的 OperationName。BeginOperationName 會立即對呼叫的執行緒傳回控制項。EndOperationName 方法則會結束非同步的 OperationName。呼叫 EndOperationName 的時間點很重要,因為如果 OperationName 尚未完成,它就會阻擋呼叫的執行緒。如需詳細資訊,請參閱非同步程式設計概觀

  • Clients callbacks:在用戶端回呼中,用戶端指令碼函式會將要求傳送至 ASP.NET Web 網頁,而不會有回傳的額外負荷。

如需使用這些部分技術的範例,請參閱事件架構非同步模式技術範例

編譯和組態選項

編譯和設定應用程式的方式都會影響應用程式的效能。下列方針會建議一些讓 Web 應用程式整體有效率運作的方法:

  • 如果您有大型的 Web 應用程式,請先行編譯。

  • 在 Internet Information Services 5.0 上執行 ASP.NET Web 應用程式時,請回收處理序。

  • 如果必要的話,請針對應用程式調整每個背景工作處理序的執行緒數目。若為高度依賴外部資源的應用程式,請考慮在多處理器電腦上啟用 Web Gardening。

  • 停用偵錯模式。

  • 使用下列技巧,調整 Web 伺服器電腦和特定應用程式的組態檔以符合您的需求:

    • 僅針對需要驗證的應用程式,啟用驗證。

    • 將應用程式設為使用適當的要求和回應編碼設定。

    • 考慮停用應用程式的 AutoEventWireup

    • 從要求處理管線移除不要使用的模組。

如需詳細資訊,請參閱 效能概觀

快取組態選項

若要改善應用程式效能,您可以在下列層級設定快取:

  • 應用程式:在應用程式的 Web.config 檔中,您可以使用 OutputCacheSection 項目來控制整個應用程式的快取。您可以使用 OutputCacheSettingsSection 項目,設定快取設定檔,然後再將快取設定檔套用至個別的頁面。

  • 電腦:您可以將 Machine.config 檔案中的選項設為與 Web.config 檔案中的選項一樣。

  • 頁面:您可以套用在組態檔中定義的快取設定檔,藉以設定個別頁面中的快取。或者,您也可以在 @ OutputCache 指示詞中,或是設定頁面類別定義中的屬性 (Attribute),藉以設定個別快取屬性 (Property)。

  • 控制項:您可以在使用者控制項檔案中設定 @ OutputCache 指示詞,或是在控制項的類別定義中設定 PartialCachingAttribute 屬性,進而設定使用者控制項快取。

如需詳細資訊,請參閱 ASP.NET 的快取組態

利用 IIS 6.0 進行記憶體回收

如果應用程式含有造成問題的程式碼 (例如具有已知記憶體遺漏 (Memory Leak) 的 COM Interop 應用程式),而且您無法輕易地重新撰寫程式碼時,透過定期回收服務應用程式的背景工作處理序來限制問題的範圍可能會很有用。背景工作處理序回收會取代記憶體中應用程式的執行個體。IIS 6.0 可以重新啟動指派給應用程式集區的背景工作處理序,藉以自動回收背景工作處理序。這樣可協助確保應用程式執行順暢。

在回收時維護狀態

如果您有一個應用程式集區,而且其中含有仰賴狀態資料的應用程式,您就必須決定是否要回收指派給該應用程式集區的背景工作處理序。當您回收背景工作處理序後,在處理序中維護之應用程式的狀態資料就會遺失。在這種情況下,您可能要選擇不使用回收。

藉由維護背景工作處理序外 (例如在資料庫中) 的狀態資料,您可以回收處理序並解決狀態問題,但跨處理序 (Out-Of-Process) 維護狀態資料以允許回收可能會在兩方面影響到伺服器效能:

  • 由於在應用程式和資料存放區之間移動資料需要管理的額外負荷,所以會降低效能。

  • 進行回收時會清除任何同處理序 (In-Process) 的資料快取,所以需要重新建置快取。

ASP.NET 可讓您選擇使用工作階段狀態服務或 SQL 資料庫來保存工作階段狀態。如需詳細資訊,請參閱工作階段狀態模式

如需詳細資訊,請參閱回收工作者處理序 (IIS 6.0) (英文)。

原生映像服務

原生映像服務是一種可以產生並維護原生映像的 Windows 服務,而原生映像就是含有已編譯之處理器特定機器碼 (Machine Code) 的檔案。原生映像服務可讓您將原生映像的安裝和更新延遲到電腦閒置的期間。原生映像產生器 (Ngen.exe) 是一種可以增進 Managed 應用程式效能的工具。Ngen.exe 會建立原生映像,然後將它們安裝至本機電腦上的原生映像快取中。執行階段就可以從快取中使用原生映像,而不是使用 Just-In-Time (JIT) 編譯器編譯原始組件。

如需詳細資訊,請參閱 MSDN Magazine 網站上的 NGen 透過全新的強大功能為您加速提升效能 (英文)。

全域組件快取和工作集

處理序的工作集是指實體 RAM 記憶體中目前可供處理序使用的記憶體分頁集合。這些分頁是常駐的,而且可供應用程式使用,而不會觸發分頁錯誤。您可以使用 PeakWorkingSetWorkingSet 屬性,監視工作集的大小。此外,您可以將組件放置在全域組件快取中,藉以減少應用程式的工作集。這個選項主要是中介層和共用組件的建議選項。

請參閱

其他資源

第 4 章:.NET 應用程式在效能和延展性方面的架構及設計檢閱 (英文)

第 6 章:改善 ASP.NET 效能 (英文)

Microsoft 典範與實例