共用方式為


應用程式域資源監視

應用程式域資源監視 (ARM) 可讓主機依應用程式域監視 CPU 和記憶體使用量。 這適用於在長時間執行進程中使用許多應用程式域的主機,例如 ASP.NET。 主機可以卸除對整個進程效能造成負面影響之應用程式的應用程式域,但前提是它可以識別有問題的應用程式。 ARM 提供可用來協助進行這類決策的資訊。

例如,主控服務可能會在 ASP.NET 伺服器上執行許多應用程式。 如果進程中的一個應用程式開始耗用太多記憶體或太多處理器時間,裝載服務可以使用ARM來識別造成問題的應用程式域。

ARM 足夠輕量,可用於即時應用程式。 您可以使用 Windows 事件追蹤 (ETW) 或直接透過受控或原生 API 來存取資訊。

啟用資源監視

ARM 可以透過四種方式啟用:在 Common Language Runtime (CLR) 啟動時提供配置檔案、使用非受管理的主機 API、使用受管理的程式碼,或監聽 ARM ETW 事件。

一旦啟用 ARM,它就會開始收集程式中所有應用程式域的數據。如果在啟用 ARM 之前建立應用程式域,累積資料會在啟用 ARM 時啟動,而不是在建立應用程式域時啟動。啟用后,就無法停用ARM。

  • 你可以在 CLR 啟動時啟用 ARM,方法是將元素加入 <appDomainResourceMonitoring> 設定檔,並將屬性設 enabledtrue。 值 false (預設值)僅表示 ARM 在啟動時未啟用;您稍後可以使用其他其中一種啟用機制加以啟用。

  • 主機可以藉由要求 ICLRAppDomainResourceMonitor 託管介面來啟用 ARM。 成功取得此介面之後,即會啟用ARM。

  • Managed Code 可以透過在 Visual Basic 中將靜態 SharedAppDomain.MonitoringIsEnabled 屬性設定為 true 來啟用 ARM。 一旦設定 屬性,ARM 就會啟用。

  • 您可以在啟動后啟用 ARM,方法是接聽 ETW 事件。 當您使用 Microsoft-Windows-DotNETRuntime 關鍵詞啟用公用提供者AppDomainResourceManagementKeyword時,ARM 會啟用並開始引發所有應用程式域的事件。 若要將數據與應用程式域和線程相互關聯,您必須啟用 Microsoft-Windows-DotNETRuntimeRundown 提供者並使用 ThreadingKeyword 關鍵字。

使用ARM

ARM 提供應用程式域所使用的處理器時間總計,以及記憶體使用量的三種資訊。

  • 應用程式域的處理器時間總計,以秒為單位:這是透過加總作業系統報告的所有在應用程式域存留期間花費時間執行的線程時間來計算的。 封鎖或睡眠中的線程不會使用處理器時間。 當執行緒呼叫原生代碼時,執行緒花費在原生代碼中的時間會包含在呼叫的應用程式域中的計數中。

  • 應用程式域在其存留期間所做的受控配置總計,以位元組為單位:總配置不一定反映應用程式域的記憶體使用量,因為配置的物件可能很短。 不過,如果應用程式配置並釋放大量物件,則配置的成本可能相當大。

  • 受控記憶體(以位元組為單位),此記憶體由應用程式域參考,且在最近一次完整封鎖式垃圾回收中倖存下來:此數位僅在完整封鎖式垃圾回收後才準確。 (這與在背景中發生的並行集合不同,而且不會封鎖應用程式。例如, GC.Collect() 方法多載會造成完整封鎖的集合。

  • 進程所參考的受管理的記憶體總計,以位元組為單位,並在最近的完整封鎖式收集中倖存下來:個別應用程式域的存留下的記憶體可以與這個數值進行比較。

判斷何時發生完整封鎖集合

要判斷留存記憶體的計數是否精確,您必須知道何時剛剛發生了一次完整的阻塞收集。 執行這項作的方法取決於您用來檢查 ARM 統計數據的 API。

受控 API

如果您使用 類別的屬性 AppDomain ,您可以使用 GC.RegisterForFullGCNotification 方法來註冊完整集合的通知。 您使用的臨界值並不重要,因為您正在等候集合完成,而不是集合的到來。 然後,您可以呼叫 GC.WaitForFullGCComplete 方法,該方法會阻塞,直到完整集合完成為止。 您可以建立線程,以在迴圈中呼叫 方法,並在每當方法傳回時執行任何必要的分析。

或者,您可以定期呼叫 GC.CollectionCount 方法,以查看第 2 代集合的計數是否已增加。 根據輪詢頻率,這項技術可能無法提供完整集合發生次數的準確指示。

託管 API

如果您使用 unmanaged 裝載 API,您的主機必須將 IHostGCManager 介面的實作傳遞給 CLR。 CLR 會在恢復執行因垃圾收集而暫停的線程時,呼叫 IHostGCManager::SuspensionEnding 方法。 CLR 會將已完成集合的產生當做 方法的參數傳遞,讓主機可以判斷集合是完整還是部分。 在實作 IHostGCManager::SuspensionEnding 方法時,可以查詢是否有存活下來的記憶體,以確保在計數更新後立即獲取它們。

另請參閱