c# - Windows 性能计数器从 PerfMon 中消失

标签 c# .net windows performancecounter

我对此感到完全困惑(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。此时,我可以添加计数器,查看类别和计数器,完美添加它,然后观察它位于0.000。完美的。此时,如果我关闭 PerfMon 并重新打开它呢?我可以很好地看到所有的系统性能计数器,但是我所有的自定义计数器 - 如前所述,在生产中工作的计数器,我基于这些计数器创建的计数器,以及人为的计数器 - -刚刚消失。

有趣的是,如果我运行上面的代码,它会始终告诉我该组存在。再深入一点,计数器甚至是存在的。这对我来说似乎很奇怪。让它仍然处于消失状态,并从 here 中获取提示,我可以运行:lodctr/R,他们确实回来了。

所以看起来我正在破坏我自己的性能计数器存储。我的问题有两个部分:

  1. 这就是我正在做的事情(破坏性能计数器存储)吗?
  2. 既然它是可重现的,那么在代码或我正在执行的创建此行为的过程中是否有什么突出的地方?

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

最佳答案

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

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

  • 还可以使用工具 typeperf 来监控计数器。根据我的经验,typeperf 并没有禁用 perfmon 会禁用的相同计数器,为您提供了监视计数器的替代方案。

关于c# - Windows 性能计数器从 PerfMon 中消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341079/

相关文章:

c# - 如何将 DataAnnotations ErrorMessageResourceName 与自定义资源解决方案一起使用

c# - C# .WPF 中的线程调用

c++ - 调用mono_jit_init时退出1

c# - 从 derived 而不是 base 调用的虚拟方法

c# - 如何在winforms上绘制自己的进度条?

c# - Microsoft Q# .Net 框架是否兼容?

c# - 20 位整数数学

c# - 如何编码为同一原始字符串字符提供不同编码字符的字符串?

c++ - 当用户按下 Ctrl 并单击时获取鼠标坐标

c - 如何确定指定时间是否已过而没有用户事件