2012-04-26 16 views
2

我完全通过这个方法进行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. 这是我在做什么(破坏性能柜台)?
  2. 既然它是可重复的,在代码或我的过程中是否有任何突出的特性可以创建此行为?

在我看来,这与其他“表现计数器消失”的问题有些不同,因为它们确实存在,我正在看着它们消失。

回答

2

很可能问题出在计算机,和/或它的配置,而不是在你的代码已经发布。我遇到了同样的情况,并没有遇到为什么打开性能监视器时柜台消失。不过,我可以帮你这个:

  • 性能监视器有时会disable performance counters通过标记它在注册表禁用。该链接可能会帮助您找到计数器被禁用的原因。

  • 监控计数器也可以使用工具typeperf完成。根据我的经验,typeperf并未禁用perfmon意志相同的计数器,为您提供监视计数器的替代方案。

+2

+1神秘感解决了!如果你进入'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services',然后找到你的性能监视器计数器类别,并在'Performance'文件夹下设置regitsry值'Disable Performance Counters'为零,它会出现在perfmon中。这解释了为什么.NET认为它在那里,但我无法在perfmon中找到它! – SharpC 2014-10-09 14:16:10

1

确保您没有混合x86和x64。

I.e.如果您的perf计数器是使用x64进程创建的,那么请确保您还使用x64进程读取它们。

此外,请尝试以管理员身份运行。