【问题标题】:Windows Performance Counters disappearing from PerfMonWindows 性能计数器从 PerfMon 中消失
【发布时间】:2012-04-26 20:38:03
【问题描述】:

我对此完全感到困惑(TM):在 Win7SP1、64 位机器上,PerfMon 似乎完全否认安装的自定义性能计数器的知识。我正在使用现有的代码库,该代码库在生产机器上安装计数器非常好,但是当我在我的机器上运行它时,当我使用我添加的计数器运行它时,或者如果我运行一个完全人为的程序集(其中的肉贴在下面),我的行为很奇怪。

使用以下代码 sn-p 可能最容易描述:

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. 由于它是可重现的,在我正在执行的代码或我的流程中是否有任何突出的地方来创建此行为?

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

【问题讨论】:

    标签: c# .net windows performancecounter


    【解决方案1】:

    问题很可能在于计算机和/或其配置,而不是您发布的代码。我也遇到过同样的情况,没有遇到打开性能监视器时计数器消失的原因。不过,我可以帮你解决这个问题:

    • Perfmon 有时会 disable performance counters 在注册表中将其标记为禁用。该链接可能会帮助您找到计数器被禁用的原因。

    • 也可以使用工具typeperf 来监控计数器。根据我的经验,typeperf 并没有禁用 perfmon 将要禁用的计数器,从而为您提供了监视计数器的替代方法。

    【讨论】:

    • +1 谜团解开了!如果您转到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,然后找到您的性能监视器计数器类别并将Disable Performance Counters 文件夹下的注册表值Disable Performance Counters 设置为零,它会出现在perfmon 中。这就解释了为什么 .NET 认为它存在但我在 perfmon 中找不到它!
    【解决方案2】:

    确保您没有混合使用 x86 和 x64。

    即如果您的性能计数器是使用 x64 进程创建的,那么请确保您也在使用 x64 进程读取它们。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-09
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多