安装了性能计数器的一个实例总数(Installing a Total instance for Pe

2019-09-17 03:04发布

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

我想安装一套性能计数器为多实例的。 我注意到一些系统性能计数器类别管理,以保持一个“ ”活着,即使没有其他实例。 ASP.NET应用2.0.50727就是一个例子。

所以,我一直在试图复制此。 我在安装程序类,然后我添加到自定义操作在安装项目创建了以下程序。

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服务器资源管理器显示了InstanceLifetime设置为全局沿着实例。 我不叫在安装程序中的RemoveInstance()方法。

不过,安装程序完成后,几秒钟后,该实例从性能监视器,并从VS服务器资源管理器中消失。 我如何坚持下去? 或者,可以吗?

Answer 1:

一些代码必须积极维护计数器。 在你能想到的所有实例,如ASP.Net,有保持计数,最多的服务。

当你不快乐与具有_Total实例只在您的应用程序的一些实例运行的活动, 你必须写一些代码,将维护您的应用程序之外的性能计数器 。 没有什么神奇。

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

背景的性能计数器的位 - 主要的理解的是,有通常的共享存储器区域,其经由互锁操作更新进程之间共享。 像性能监视器的工具(或任何其它应用程序)结束了连接到共享存储区域来获取当前值。 因此,一些工艺必须有共享内存区域打开和拥有。 因此,为什么你需要的代码的运行。 你(它确实有专柜,允许平均值和价格的一些非常令人费解的组合,而不是一笔创建摘要实例)性能监视器也没有创造_Total实例。



Answer 2:

据我所知的任何进程具有积极的手柄引用它的全球性能计数器类别仍将只要活着。 系统计数器在某些服务保持一个句柄总计数器实例实现这一目标。



Answer 3:

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



Answer 4:

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

Counter.ReadOnly = true;

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

而且,如果你使计数器只读你显然需要注释掉该行:

Counter.RawData = 0;

我相信,在默认情况下它设置为0第一遍进不去。

希望这可以帮助...



文章来源: Installing a Total instance for Performance Counters