创建的性能计数器不可见

Posted

技术标签:

【中文标题】创建的性能计数器不可见【英文标题】:Created performance counters not visible 【发布时间】:2013-10-17 10:54:28 【问题描述】:

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

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

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

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

using System;
using System.Diagnostics;

命名空间性能计数器 课堂节目 静态无效主要() var program = new Program(); 程序.运行();

    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);
    

【问题讨论】:

您测试的所有机器是否都运行相同的操作系统? 是的。它们都运行 Windows7 64 位。我还在 win2003 上运行了我的安装程序,并且类别出现在性能监视器中。 【参考方案1】:

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

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

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

【讨论】:

以上是关于创建的性能计数器不可见的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在远程 Windows 机器上创建性能计数器?

为啥我的 ASP.NET MVC 多实例性能计数器不起作用

如何访问代码中的 C# 性能计数器?

创建性能计数器 PowerShell:指定类别的计数器布局无效

如何在 w2k8 中使用性能计数器

使用 PowerShell 在远程服务器上创建性能计数器