WCF性能計數器應用特點介紹
WCF開發工具功能強大,其中包含有許多功能特點,值得我們去深入研究。其中就包括我們今天為大家介紹的WCF性能計數器。在這篇文章中,大家將會通過各種示例來詳細了解一下WCF性能計數器的應用方式。
啟用WCF性能計數器
您可以通過 WCF 服務的 app.config 配置文件啟用 WCF 服務的性能計數器,如下所示:
- < configuration>
- < system.serviceModel>
- < diagnostics performanceCounters="All" />
- < /system.serviceModel>
- < /configuration>
可以將 performanceCounters 屬性設置為啟用特定類型的性能計數器。有效值為
All:啟用所有類別計數器(ServiceModelService、ServiceModelEndpoint 和 ServiceModelOperation)。
ServiceOnly:僅啟用 ServiceModelService 類別計數器。
Off:禁用 ServiceModel* 性能計數器。這是默認值。
如果要啟用所有 WCF 應用程序的性能計數器,則可以將配置設置放置到 Machine.config 文件中。有關在計算機上為性能計數器配置足夠內存的更多信息,請參見“增加性能計數器的內存大小”(可能為英文網頁)一節。
還可以在代碼中啟用WCF性能計數器,如下所示:
- using System.Configuration;
- using System.ServiceModel.Configuration;
- using System.ServiceModel.Diagnostics;
- Configuration config = ConfigurationManager.OpenExeConfiguration(
- ConfigurationUserLevel.None);
- ServiceModelSectionGroup sg = ServiceModelSectionGroup.
GetSectionGroup(config);- sg.Diagnostic.PerformanceCounters = PerformanceCounterScope.All;
- config.Save();
查看性能數據#t#
若要查看性能計數器捕獲的數據,則可以使用 Windows 附帶的性能監視器 (Perfmon.exe)。通過轉到“開始”,單擊“運行”并在對話框中鍵入 perfmon.exe 以啟動該工具。
注意:
WCF性能計數器實例可能會在終結點調度程序處理最后一條消息之前被釋放。這可能導致不能為某些消息捕獲性能數據。
增加性能計數器的內存大小
WCF 為其性能計數器類別使用單獨的共享內存。
默認情況下,單獨的共享內存被設置為全局性能計數器內存大小的四分之一。默認的全局性能計數器內存大小為 524,288 字節。因此,三個 WCF 性能計數器類別默認分別具有約 128KB 的內存大小。根據計算機上 WCF 應用程序的運行時特性,性能計數器內存可能會用盡。發生這種情況時,WCF 會向應用程序事件日志中寫入一個錯誤。該錯誤的內容聲明未加載性能計數器,并聲明一個包含異常“System.InvalidOperationException:可用于自定義計數器文件視圖的內存不足。”的項。如果在錯誤級別啟用了跟蹤,此故障也將被跟蹤。如果性能計數器內存已用盡,在啟用性能計數器的情況下繼續運行您的 WCF 應用程序可能會導致性能明顯下降。如果您是計算機管理員,則應對計算機進行配置,以便分配足夠的內存來支持隨時可能存在的最大數量的性能計數器。有關更多信息,請參見 performanceCounters(可能為英文網頁)。
可以在注冊表中更改 WCF 類別的性能計數器的內存量。為此,需要向以下三個位置添加名為 FileMappingSize 的新 DWORD 值,并將它設為所需的值(以字節為單位)。重新啟動您的計算機以使這些更改生效。
HKLM\System\CurrentControlSet\Services\ServiceModelEndpoint 3.0.0.0\Performance
HKLM\System\CurrentControlSet\Services\ServiceModelOperation 3.0.0.0\Performance
HKLM\System\CurrentControlSet\Services\ServiceModelService 3.0.0.0\Performance
當釋放的大量對象(例如 ServiceHost)等待進行垃圾回收時,PrivateBytes 性能計數器將記錄一個非常大的數字。若要解決此問題,可以添加特定于自己的應用程序的計數器,或使用 performanceCounters 屬性僅啟用服務級別計數器。
WCF性能計數器的類型
性能計數器可分為三個不同級別:服務、終結點和操作。
可以使用 WMI 檢索性能計數器實例的名稱。例如,
通過 WMI Service實例的“CounterInstanceName”屬性可獲得服務計數器實例的名稱。
通過 WMI 終結點實例的“CounterInstanceName”屬性可獲得終結點計數器實例的名稱。
通過 WMI 終結點實例的“GetOperationCounterInstanceName”方法可獲得操作計數器實例的名稱。
有關 WMI 的更多信息,請參見使用 Windows Management Instrumentation 進行診斷。
服務WCF性能計數器
服務性能計數器將服務行為作為整體來進行衡量,可用于診斷服務整體性能。如果使用性能監視器查看,可以在 ServiceModelService 3.0.0.0 性能對象下找到服務性能計數器。使用以下模式命名計數器實例:
ServiceName@ServiceBaseAddress服務范圍內的計數器是從終結點集合中的計數器聚合來的。
創建新的 InstanceContext 時,用于創建服務實例的性能計數器將遞增。請注意,即使在(通過現有服務)收到非激活消息時,或在從一個會話連接到實例、結束會話然后從其他會話重新進行連接時,也將創建新的 InstanceContext。
終結點性能計數器使用終結點性能計數器可以查看反映終結點如何接受消息的數據。使用性能監視器查看時,可在 ServiceModelEndpoint 3.0.0.0 性能對象下找到終結點性能計數器。使用以下模式命名計數器實例:
(ServiceName).(ContractName)@(endpoint listener address)數據與為單個操作收集的數據類似,但它只在終結點之間聚合。
終結點范圍內的計數器是從操作集合中的計數器聚合來的。
注意:
如果兩個終結點具有相同的協定名稱和地址,它們將映射到同一個計數器實例中。
操作WCF性能計數器
如果使用性能監視器查看,可以在 ServiceModelOperation 3.0.0.0 性能對象下找到操作性能計數器。每個操作都有一個單獨的實例。也就是說,如果給定的協定具有 10 個操作,則有 10 個操作計數器實例與該協定相關聯。對象實例按下面的模式命名:
(ServiceName).(ContractName).(OperationName)@(first endpoint listener address)使用此計數器可以衡量調用的使用方式以及操作的執行情況。
當計數器在多個范圍內可見時,從范圍的較高一級收集到的數據會與從范圍的較低一級收集到的數據相聚合。例如,終結點處的 Calls 表示終結點內所有操作調用的總和;服務處的 Calls 表示對服務內所有終結點的所有調用的總和。
注意:
如果一個協定上有兩個操作名稱,則只能為這兩個操作獲取一個計數器實例。