创建的性能计数器不可见

时间:2013-10-17 10:54:28

标签: c# .net performancecounter

我必须以programmaticaly方式创建性能计数器。似乎代码正在运行,但我没有在perfmon中看到性能计数器类别。当我的意思是代码工作时,我说它不会抛出任何异常。我是以管理员身份运行它。

我已经看到SO的答案说可能需要一些时间来出现计数器。但我在回家之前安装了它们,第二天它们仍然不可见。

这是一个用于测试它的小型控制台应用程序。我安装了计数器,然后使用它们但在性能监视器中看不到它们。

编辑:我在3台机器上进行了测试,并按预期在其中一台机器上运行(perfmon中的perf计数器可见)。是否有可能在Windows中的其他地方看到性能计数器(Powershell,一些sysinternals工具?)

using System;
using System.Diagnostics;

namespace PerfCounters { class Program { static void Main() { var program = new Program(); program.Run(); }

    private const string CATEGORY_NAME = "AAAMySpecialCategory";
    private const string CATEGORY_HELP = "AAAMySpecialCategory Help";
    private const string OPS_IN_CURRENT_COUNTER_NAME = "# current calls";

    public void Run()
    {
        while (true)
        {
            PrintUsage();
            Console.Write(":> ");
            var keyInfo = Console.ReadLine();
            if (keyInfo == "q")
            {
                break;
            }

            switch (keyInfo)
            {
                case "i":
                    InstallPerfCountersCategory();
                    break;

                case "c":
                    Console.WriteLine(PerformanceCounterCategoryExists()
                            ? "Perf counter category ({0}) does exist"
                            : "Perf counter categry ({0}) does not exist", CATEGORY_NAME);
                    break;

                case "w":
                    IncrementPerfCounter();
                    break;

                case "u":
                    UninstallPerfCountersCategory();
                    break;
            }
        } 
    }

    private static void PrintUsage()
    {
        Console.WriteLine();
        Console.WriteLine("Usage:");
        Console.WriteLine("i - install performance counters category ({0})", CATEGORY_NAME);
        Console.WriteLine("c - check if category exists ({0})", CATEGORY_NAME);
        Console.WriteLine("w - work with perf counter (increment)");
        Console.WriteLine("u - uninstall performance counters category ({0})", CATEGORY_NAME);
        Console.WriteLine("q - quit");
    }
    private void IncrementPerfCounter()
    {
        if (!PerformanceCounterCategoryExists())
        {
            Console.WriteLine("Perf counter category ({0}) does not exist - install first", CATEGORY_NAME);
            return;
        }

        var currentOps = new PerformanceCounter(CATEGORY_NAME, OPS_IN_CURRENT_COUNTER_NAME, false);
        Console.Write("Incrementing perf counter");
        currentOps.Increment();
        Console.WriteLine(" - incremented");
    }
    private void InstallPerfCountersCategory()
    {
        if (PerformanceCounterCategoryExists())
        {
            Console.WriteLine("Uninstall first");
            return;
        }

        var ccdc = new CounterCreationDataCollection
        {
            new CounterCreationData(OPS_IN_CURRENT_COUNTER_NAME, "", PerformanceCounterType.NumberOfItems32),
        };

        PerformanceCounterCategory.Create(CATEGORY_NAME, CATEGORY_HELP, PerformanceCounterCategoryType.SingleInstance, ccdc);
        Console.WriteLine("Installed");
    }
    private void UninstallPerfCountersCategory()
    {
        if (PerformanceCounterCategoryExists())
        {
            Console.WriteLine("Deleting perf counter category ({0})", CATEGORY_NAME);
            PerformanceCounterCategory.Delete(CATEGORY_NAME);
        }
        else
        {
            Console.WriteLine("Perf counter category ({0}) does not exist - install first", CATEGORY_NAME);
        }
    }
    private bool PerformanceCounterCategoryExists()
    {
        return PerformanceCounterCategory.Exists(CATEGORY_NAME);
    }
}

}

private const string CATEGORY_NAME = "AAAMySpecialCategory"; private const string CATEGORY_HELP = "AAAMySpecialCategory Help"; private const string OPS_IN_CURRENT_COUNTER_NAME = "# current calls"; public void Run() { while (true) { PrintUsage(); Console.Write(":> "); var keyInfo = Console.ReadLine(); if (keyInfo == "q") { break; } switch (keyInfo) { case "i": InstallPerfCountersCategory(); break; case "c": Console.WriteLine(PerformanceCounterCategoryExists() ? "Perf counter category ({0}) does exist" : "Perf counter categry ({0}) does not exist", CATEGORY_NAME); break; case "w": IncrementPerfCounter(); break; case "u": UninstallPerfCountersCategory(); break; } } } private static void PrintUsage() { Console.WriteLine(); Console.WriteLine("Usage:"); Console.WriteLine("i - install performance counters category ({0})", CATEGORY_NAME); Console.WriteLine("c - check if category exists ({0})", CATEGORY_NAME); Console.WriteLine("w - work with perf counter (increment)"); Console.WriteLine("u - uninstall performance counters category ({0})", CATEGORY_NAME); Console.WriteLine("q - quit"); } private void IncrementPerfCounter() { if (!PerformanceCounterCategoryExists()) { Console.WriteLine("Perf counter category ({0}) does not exist - install first", CATEGORY_NAME); return; } var currentOps = new PerformanceCounter(CATEGORY_NAME, OPS_IN_CURRENT_COUNTER_NAME, false); Console.Write("Incrementing perf counter"); currentOps.Increment(); Console.WriteLine(" - incremented"); } private void InstallPerfCountersCategory() { if (PerformanceCounterCategoryExists()) { Console.WriteLine("Uninstall first"); return; } var ccdc = new CounterCreationDataCollection { new CounterCreationData(OPS_IN_CURRENT_COUNTER_NAME, "", PerformanceCounterType.NumberOfItems32), }; PerformanceCounterCategory.Create(CATEGORY_NAME, CATEGORY_HELP, PerformanceCounterCategoryType.SingleInstance, ccdc); Console.WriteLine("Installed"); } private void UninstallPerfCountersCategory() { if (PerformanceCounterCategoryExists()) { Console.WriteLine("Deleting perf counter category ({0})", CATEGORY_NAME); PerformanceCounterCategory.Delete(CATEGORY_NAME); } else { Console.WriteLine("Perf counter category ({0}) does not exist - install first", CATEGORY_NAME); } } private bool PerformanceCounterCategoryExists() { return PerformanceCounterCategory.Exists(CATEGORY_NAME); } }

1 个答案:

答案 0 :(得分:3)

我有同样的问题 - .NET代码报告说计数器在那里,但是在perfmon中没有可见的这样的计数器类别。

显然,perfmon有时会disable performance counters by flagging it as disabled in the registry

如果您在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servicescheck in the registry,您应该能够找到您的效果计数器类别(只需将您的类别名称作为“文件夹”之一)。在子项(“文件夹”)下Performance找到注册表值Disable Performance Counters并将其设置为零。重新启动perfmon,您现在应该在perfmon中看到您的类别和计数器。

相关问题