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中消失.我该怎么做才能坚持下去?或者我可以吗?
解决方法
有些代码必须积极维护计数器.在您可以想到的所有情况中,例如ASP.Net,都有一项服务可以保持计数器.
由于您不满意在应用程序的某个实例运行时只有_Total实例处于活动状态,因此您必须编写一些代码来维护应用程序之外的性能计数器.没有魔力.
您可以编写一个满足您监控需求的小型服务.这将保持_Total计数器.您需要决定更新方案.最简单的方法是让应用程序的每个实例更新两个实例(自己的实例和_Total).
关于性能计数器的一些背景知识 – 要理解的主要是通常在通过互锁操作更新的进程之间共享共享内存区域.像PerfMon(或任何其他应用程序)这样的工具最终连接到共享内存区域以获取当前值.因此,某些进程必须打开并拥有该共享内存区域.这就是你需要运行代码的原因. PerfMon没有为你创建_Total实例(它确实有一些非常复杂的计数器组合,允许平均值和速率,但不是创建摘要实例的总和).