性能计数器丢失了

时间:2013-01-03 13:05:04

标签: c# windows performancecounter

我的问题是,某些性能计数器类似乎有时会丢失,我不明白为什么。

下面的代码会引发异常,如下所示:

无法查找效果类别

  

错误消息:类别不存在。 CategoryName:HP EVA物理磁盘
  目标群组类别列表:
  ServiceModelService 4.0。
  bla bla

打印出来包含一长串性能计数器,但不是我追求的那个。如果我查看perfmon.exe,我可以找到一次丢失的类别。

我正在使用以下代码查找某个类别中的不同计数器。

public static string[] GetPerformanceCategory(string CategoryName)
{
    //Console.WriteLine("CategoryName to Search for: " + CategoryName);
    if (string.IsNullOrEmpty(CategoryName))
        throw new NullReferenceException("CategoryName is empty");

    try
    {
        PerformanceCounterCategory perfCat = new PerformanceCounterCategory(CategoryName);

        string[] catInstances = perfCat.GetInstanceNames();
        return catInstances;
    }
    catch(Exception Ex)
    {
        StringBuilder ErrorMsg = new StringBuilder();
        ErrorMsg.AppendLine("Failed to lookup Preformance Category");
        ErrorMsg.AppendLine("Error Msg: " + Ex.Message);
        ErrorMsg.AppendLine("CategoryName: " + CategoryName);
        ErrorMsg.AppendLine("Category list on target:");

        StringBuilder CatList = new StringBuilder();
        var categories = PerformanceCounterCategory.GetCategories();
        foreach (var Cat in categories)
            CatList.AppendLine(Cat.CategoryName);                

        ErrorMsg.AppendLine(CatList.ToString());

        Logger.WriteToLog(ErrorMsg.ToString(), EventLogEntryType.Error);
        return null;
    }      
}

问题可归结为,是否有一些可以让表演专柜消失的“魔力”?或许我需要做一些具体的事情?

3 个答案:

答案 0 :(得分:2)

我有完全相同的问题,这就是我解决它的方法:

服务器体系结构(x86或x64)和.net(c#)构建目标必须相同,否则您的代码无法访问所有性能计数器(如果构建目标和服务器不同,则只有一部分性能计数器可用)。

因此在Visual Studio中,右键单击您的项目(在解决方案资源管理器中),然后选择“属性”,然后转到“构建”并选择x64作为平台目标(如果您的服务器是x64,否则选择x86)

答案 1 :(得分:1)

更具体一点,您可以检查“事件查看器”并查找PerfLib事件。

就我而言,它们被标记为错误。

然后,环顾四周后,我发现了上面解释的两个命令。就我而言,问题出在perfOS上。 (您始终可以运行lodctr /q:Perflib来检查已禁用的内容。

然后运行:lodctr / e:perfOS(或为禁用的任何服务更改perfOS)

那可以(至少对我有用)

TLDR:以管理员身份运行lodctr /q:perfOslodctr /e:perfOS

答案 2 :(得分:0)

我也使用PerformanceCounterCategory.GetCategories()来解决这个问题。 我的类别在1台机器上缺失。其他人没有问题。

Perfmon可以在同一个提升的命令提示符下看到类别,typeperf可以看到类别,但不能通过.net代码看到。

一个注意事项。在Windows Server 2008 R2上出现问题。在XP或Windows 7中不会出现此问题。