PerformanceCounter在某些机器上不返回值

时间:2019-02-18 11:45:54

标签: c# performance counter performancecounter

我正在使用.NETs System.Diagnostics.PerformanceCounter类检索Web服务进程的内存使用率和CPU时间百分比。

在Win10开发计算机上本地运行代码,调用NextValue()返回正确的值。将二进制文件移至Windows Server 2012计算机后,我立即得到

  • PerformanceCounter(“ Process”,“%Processor Time”,Process.GetCurrentProcess()。ProcessName)的0s
  • PerformanceCounter(“ Processor”,“%Processor Time”,“ _Total”)的“大多数”为0(间歇地,我在那里获得了适当的值,但实际上只有十分之一左右的值实际上不是0的数字
  • PerformanceCounter(“ Process”,“ Working Set”,p.ProcessName)的伪造值(且不随实际使用情况变化)(实际上,在应用程序完全重启后,该值始终保持恒定为44 MB)服务上的负载。

没有引发异常,表明我使用了错误的计数器名称或进程名称。

这就是我尝试过的(没有成功)

  • 检查是否有任何“禁用性能监视器”注册表项(找不到)
  • 使用lodctr / R重建性能计数器设置
  • 以提升的特权运行应用程序
  • 将运行应用程序的用户添加到“性能监视器用户”组中
  • 将运行应用程序的用户添加到“性能日志用户”组中
  • 在Powershell中运行了Get-Counter -Counter“ \ Processor(*)\%Processor Time”->每次调用都获得了有效的号码(但第一个可以)

我想念什么?例如,与PerformanceCounters返回错误值或0有关的大多数答案与NextValue仅被调用一次有关。这里不是这种情况(这使得找到解决方案有些困难)。我非常了解该限制,并且我不希望要返回的第一个值非零。随之而来的所有其他值都是错误的或为0。

1 个答案:

答案 0 :(得分:1)

这就是问题所在:

我最初是“ kinda”,它是通过重新启动服务器来修复的。这使我相信,每次调用lodctr都是废话(phe)后,您必须重新启动 我猜这只是偶尔起作用是因为服务器上服务的启动顺序。

原来,在不起作用的服务器上,有多个具有相同可执行文件名的进程,这意味着调用PerformanceCounter(“ Process”,“%Processor Time”, Process.GetCurrentProcess( ).ProcessName )会给您带来完全的垃圾。

假设您正在运行三个服务,它们全部使用相同的可执行文件名称“ MyWebService.exe”,但是它们可能都位于不同的位置,使用不同的配置等,那么您需要使用“实例名称” “ MyWebService#1”,“ MyWebService#2”等。

当然,在#号后面找到要使用的正确数字有些棘手。 而且,更糟的是:如果有人杀死MyWebService#1,则MyWebService#2的PerformanceCounters将开始监视指标,以替代以前的MyWebService#3。不管监视MyWebService#3为何,都会得到一个异常。

.NET团队的好主意。与其像一个理智的人那样使用进程 ID ,为什么不使用带有后缀的进程名称来识别进程o_O

所以:

  1. 您需要定期更新PerformanceCounter.InstanceName以确保您获得正确的流程
  2. 实际上,您需要另一个PerformanceCounter来获得正确的InstanceName,这太慢了。

搜索“ PerformanceCounter多个进程名称”以获得更多有用的链接

感谢@PavelAnikhouski的帮助