6

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 会显示该实例以及设置为 Global 的 InstanceLifetime。我没有在安装程序中调用 RemoveInstance() 方法。

然而,在安装程序完成几秒钟后,该实例从性能监视器和 VS 服务器资源管理器中消失。我如何让它粘住?或者我可以吗?

4

4 回答 4

7

一些代码必须积极维护计数器。在您能想到的所有实例中,例如 ASP.Net,都有一项服务可以保持计数器正常运行。

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

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

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

于 2009-11-02T04:36:01.023 回答
1

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

于 2009-10-31T22:45:10.590 回答
0

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

于 2009-06-29T11:30:28.903 回答
0

只是一个建议,但尝试做

Counter.ReadOnly = true;

第一次通过并且仅在需要增加计数器时将其设置为 False。

而且,如果您将 Counter Readonly 设置为只读,您显然需要注释掉该行:

Counter.RawData = 0;

我相信无论如何它在第一次通过时默认设置为 0。

希望这可以帮助...

于 2009-06-30T03:07:31.707 回答