我对此感到完全困惑(TM):在 Win7SP1、64 位机器上,PerfMon
似乎完全否认已安装的自定义性能计数器的知识。我正在使用一个现有的代码库,该代码库在生产机器上完美地安装了计数器,但是当我在我的机器上运行它时,当我使用我添加的计数器运行它时,或者如果我运行一个完全人为的程序集(其内容粘贴在下面),我得到了非常奇怪的行为。
使用以下代码片段来描述可能是最简单的:
var category = "SuperTest";
var counterName = "Test Counter 1";
var shouldInstall = true;
if (PerformanceCounterCategory.Exists(category))
{
shouldInstall = false;
Console.WriteLine("{0} Category Exists. Overwrite? [n]", category);
var input = Console.ReadLine();
if (bool.TryParse(input, out shouldInstall))
{
PerformanceCounterCategory.Delete(category);
}
}
if (shouldInstall)
{
var col = new CounterCreationDataCollection();
col.Add(new CounterCreationData()
{
CounterName = counterName,
CounterType = PerformanceCounterType.NumberOfItems64
});
PerformanceCounterCategory.Create(category, "Test category.", PerformanceCounterCategoryType.SingleInstance, col);
// Magical voodoo line that may indicate my inexperience, but whose inclusion or
// exclusion does not affect discernibly affect behavior.
PerformanceCounter.CloseSharedResources();
}
// Multithreading setup, each thread repeats block below infinitely:
{
System.Threading.Thread.Sleep((new Random()).Next(100));
try
{
var counter = new PerformanceCounter(category, counterName, false));
c.Increment();
}
catch (Exception ex) { /* ... */ }
}
第一次运行时,该类别不存在,它会继续创建类别和计数器。我杀死进程,然后打开PerfMon
。此时,我可以Add Counter
,查看类别和计数器,将其完美添加,然后观察它位于0.000
。完美的。此时,如果我关闭PerfMon
并重新打开它?我可以很好地看到所有的系统性能计数器,但是我所有的自定义计数器——如上所述,在生产中工作的计数器,我基于这些计数器创建的计数器,and那些做作的——就这样消失了。
有趣的是,如果我运行上面的代码,它会始终告诉我该组存在。再深入一点,计数器甚至是存在的。这对我来说似乎很奇怪。让它保持消失的状态,并从here, 我可以跑:lodctr /R
, 和他们do回来。
所以看起来我在某种程度上破坏了我自己的性能计数器存储。我的问题有两个部分:
- 这是我正在做的事情(破坏性能计数器存储)吗?
- 由于它是可重现的,因此在代码或我正在执行的创建此行为的过程中是否有任何突出的内容?
在我看来,这与其他“性能计数器消失”问题有些不同,因为它们确实存在,而我正在看着它们消失。