我完全通过这个方法进行Baffled(TM):在Win7SP1上,64位机器PerfMon
似乎完全否认了已安装的自定义性能计数器的知识。我正在使用现有的代码库,它可以在生产计算机上完美地安装计数器,但是当我在计算机上运行计数器时,当我使用已添加的计数器运行它时,或者如果我运行一个完全人为设计的程序集其中的肉被粘贴在下面),我非常怪异的行为。Windows性能计数器从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
并重新打开它?我可以看到所有的系统性能计数器就好了,但我所有的自定义的 - 正如前面提到的,在生产工作的,我创建基于这些,和做作的人的那些 - 只是走了。
有趣的是,如果我运行上面的代码,它会一直告诉我该组存在。潜水更深,柜台甚至存在。这对我来说似乎很奇怪。离开它仍处于消失状态,并从here提示,我可以运行:lodctr /R
,他们做回来。
所以它看起来像是在破坏我自己的表演柜台。我的问题有两部分:
- 这是我在做什么(破坏性能柜台)?
- 既然它是可重复的,在代码或我的过程中是否有任何突出的特性可以创建此行为?
在我看来,这与其他“表现计数器消失”的问题有些不同,因为它们确实存在,我正在看着它们消失。
+1神秘感解决了!如果你进入'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services',然后找到你的性能监视器计数器类别,并在'Performance'文件夹下设置regitsry值'Disable Performance Counters'为零,它会出现在perfmon中。这解释了为什么.NET认为它在那里,但我无法在perfmon中找到它! – SharpC 2014-10-09 14:16:10