6

I'm using the flowing code, but it says that category does not exist.

static PerformanceCounter cpuUsage;

public static void Main(string[] args)
{
    cpuUsage = new PerformanceCounter("Processor", "% Processor Time", "_Total");

    Console.WriteLine(cpuUsage.NextValue() + " %");
    Thread.Sleep(1000);
    Console.WriteLine(cpuUsage.NextValue() + " %");
    Console.Read();
}
4

6 回答 6

18

下午好!

此问题的核心原因是注册表中指向性能计数器的指针看似随机损坏。这种情况很少发生,但最常发生在 Windows Server 2008 R2 上。

严格来说,默认情况下,“进程”和“处理器”类别应始终作为性能计数器存在。如果它们丢失,则可能还有许多其他计数器丢失。如果“处理器信息”计数器也已损坏,则先前的解决方案将无法解决问题。要最终解决此问题,您可以运行以下命令:

lodctr /R

这将修复指向计数器的任何损坏的指针。要验证此解决方案,您可以转到服务器管理器 -> 监控 -> 性能监视器 -> 添加 ... 在此视图中,您可以查看所有当前注册的性能计数器。“处理器”和“进程”现在都应该可用。或者,您也可以运行以下命令来查看所有可用计数器的状态:

lodctr /Q

附带说明,此命令应从管理控制台运行;否则此过程可能会失败并显示“错误代码:5(拒绝访问)”

于 2016-01-05T15:34:56.570 回答
6

利用

new PerformanceCounter("Processor Information", "% Processor Time", "_Total");

代替

new PerformanceCounter("Processor", "% Processor Time", "_Total");
于 2012-09-16T04:26:06.507 回答
1

检查有问题的性能计数器是否已启用。我发现我们的一些服务器上禁用了一堆计数器。

这是一些 PowerShell 来查找禁用的计数器:

Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Services\*\Performance | 
    Where-Object { ($_ | Get-ItemProperty -Name 'Disable Performance Counters' -ea Ignore).'Disable Performance Counters' -eq 1 }

这是我们用来重新启用所有禁用计数器的 PowerShell:

Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Services\*\Performance | 
    Where-Object { ($_ | Get-ItemProperty -Name 'Disable Performance Counters' -ea Ignore).'Disable Performance Counters' -in @(0,1) } | 
    Remove-ItemProperty -Name 'Disable Performance Counters' -Verbose -WhatIf

我选择删除Disable Performance Counters键值而不是将其设置为0,因此-in @(0,1)上面的子句。

一些 ASP.NET 计数器的Disable Performance Counters值设置为42。我留下了那些。

于 2018-07-26T20:52:38.750 回答
1

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

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

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

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

那会做(至少它对我有用)

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

于 2019-10-30T13:36:26.830 回答
0

使用此静态方法 ( MSDN ):

PerformanceCounterCategory.GetCategories()

检索在您的机器上注册的所有类别的数组。也许Processor已经本地化了。

有关检索所有计数器的代码,请参阅SO 答案。

于 2012-09-15T09:56:10.130 回答
-1

它在我的最后工作正常。看图。

于 2012-09-15T08:47:05.400 回答