为性能计数器安装Total实例

时间:2009-06-27 01:21:43

标签: c# .net windows installation performancecounter

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

我正在尝试为MultiInstance安装一组性能计数器。我注意到,即使没有其他实例,某些系统性能计数器类别仍设置为“”。 ASP.NET Apps 2.0.50727就是一个例子。

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

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()行并单步执行,我可以看到计数器实际上是使用正确的实例名称创建的,并且Visual Studio Server Explorer显示实例以及InstanceLifetime设置为Global。我没有在安装程序中调用RemoveInstance()方法。

然而,在安装程序完成几秒钟后,该实例将从性能监视器和VS Server Explorer中消失。我该怎么做才能坚持下去?或者我可以吗?

4 个答案:

答案 0 :(得分:7)

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

由于您对应用程序的某个实例运行时_Total实例仅处于活动状态不满意,您必须编写一些代码,以便在应用程序之外维护性能计数器。没有魔力。

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

性能计数器的一些背景知识 - 要理解的主要事情是,通常通过互锁操作更新进程之间共享的共享内存区域。像PerfMon(或任何其他应用程序)这样的工具最终连接到共享内存区域以获取当前值。因此,某些进程必须打开并拥有该共享内存区域。这就是你需要运行代码的原因。 PerfMon没有为你创建_Total实例(它确实有一些非常复杂的计数器组合,允许平均值和速率,但不是创建摘要实例的总和)。

答案 1 :(得分:1)

只要任何进程具有引用它的活动句柄,AFAIK全局性能计数器类别将保持活动状态。系统计数器通过在某些服务中保留总计数器实例的句柄来实现此目的。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

Counter.ReadOnly = true;

第一次传递,只在需要递增计数器时将其设置为False。

如果您使用Counter Readonly,您显然需要注释掉该行:

Counter.RawData = 0;

我认为无论如何它默认设置为0。

希望这会有所帮助......