为性能计数器安装一个Total实例

VS 2005,C#2.0,.NET 2.0 / 3.0,Win2003

我正在尝试为MultiInstance安装一组性能计数器。 我注意到,即使没有其他实例,一些系统性能计数器类别也能保持“ 总计 ”状态。 ASP.NET应用程序2.0.50727是一个例子。

所以我一直在试图复制这个。 我在Installer类中创build了以下例程,然后将其添加到安装项目中的自定义操作中。

public override void Install(System.Collections.IDictionary stateSaver) { //Debugger.Break(); CounterCreationData data = new CounterCreationData("ZCounter", "ZCtrHelp", PerformanceCounterType.NumberOfItems32); PerformanceCounterCategory.Create("ZCategory", "ZCatHelp", PerformanceCounterCategoryType.MultiInstance, new CounterCreationDataCollection(new CounterCreationData[] { data })); PerformanceCounter counter = new PerformanceCounter(); counter.CategoryName = "ZCategory"; counter.CounterName = "ZCounter"; counter.InstanceName = "ZTotal"; counter.InstanceLifetime = PerformanceCounterInstanceLifetime.Global; counter.ReadOnly = false; counter.RawValue = 0; base.Install(stateSaver); } 

如果我取消Debugger.Break()行的注释并逐步执行,则可以看到计数器实际上是使用正确的实例名称创build的,而Visual Studio Server Explorer则显示InstanceLifetime设置为Global的实例。 我不会在安装程序中调用RemoveInstance()方法。

但是,安装程序完成几秒钟后,该实例将从性能监视器和VS Server Explorer中消失。 我如何让它坚持下去? 或者我可以吗?

Solutions Collecting From Web of "为性能计数器安装一个Total实例"

一些代码必须积极维护柜台。 在所有可以想到的情况下,例如ASP.Net,都有一种服务保持柜台。

由于只有在应用的某个实例正在运行时_Total实例才处于活动状态,因此您不得不编写一些代码来维护应用程序之外的性能计数器 。 没有魔法。

您可以编写一个小型服务来满足您的监控需求。 这将保持_Total计数器。 你需要决定更新方案。 最简单的方法是让你的应用程序的每个实例更新两个实例(他们自己的和_Total)。

关于性能计数器的一些背景知识 – 主要要了解的是在进程之间共享的共享内存区域通过互锁操作进行更新。 像PerfMon(或任何其他应用程序)工具结束连接到共享内存区域以获取当前值。 所以一些进程必须拥有共享的内存区域。 因此,为什么你需要运行代码。 PerfMon不会为你创建_Total实例(它确实有一些相当复杂的计数器组合,允许平均值和速率,但不能创建一个总结实例)。

AFAIK一个全局性能计数器类别将保持活动,只要任何进程有一个活动的句柄引用它。 系统计数器通过在一些服务中保持对总计数器实例的处理来实现这一点。

尝试使用“PerformanceCounterCategoryType.SingleInstance”创建类别。

只是一个建议,但尝试作出

 Counter.ReadOnly = true; 

当你需要增加计数器时,第一次通过并只设置为False。

而且,如果你使反转只读,你显然需要注释掉这一行:

 Counter.RawData = 0; 

无论如何,我相信默认设置为0。

希望这可以帮助…