C# PerformanceCounter在某些计算机上不返回值

C# PerformanceCounter在某些计算机上不返回值,c#,performance,counter,performancecounter,C#,Performance,Counter,Performancecounter,我正在使用.NETs System.Diagnostics.PerformanceCounter类检索webservice进程的内存使用情况和CPU时间百分比 在我的Win10开发机器上本地运行代码,调用NextValue()返回正确的值。一旦我将二进制文件移动到Windows Server 2012机器上,我就会 0表示PerformanceCounter(“进程”,“处理器时间”,Process.GetCurrentProcess().ProcessName) 对于PerformanceC

我正在使用.NETs System.Diagnostics.PerformanceCounter类检索webservice进程的内存使用情况和CPU时间百分比

在我的Win10开发机器上本地运行代码,调用NextValue()返回正确的值。一旦我将二进制文件移动到Windows Server 2012机器上,我就会

  • 0表示PerformanceCounter(“进程”,“处理器时间”,Process.GetCurrentProcess().ProcessName)
  • 对于PerformanceCounter(“Processor”,“Processor Time”,“_Total”)(我偶尔会在那里得到适当的值,但实际上只有大约每10个值中有一个不是0的数字)
  • PerformanceCounter(“Process”、“Working Set”、p.ProcessName)的值完全是假的(且不随实际使用情况而改变)(事实上,在应用程序的完全重新启动过程中,无论服务上的负载如何,该值都保持为常量44 MB)
没有抛出异常,表明我使用了错误的计数器名称或进程名称

以下是我尝试过的(没有成功)

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

我遗漏了什么?大多数关于PerformanceCounter返回错误值或0的答案都与只调用一次NextValue有关。这里不是这样(这使得找到解决方案有些困难)。我非常清楚这个限制,我不希望返回的第一个值是非零。接下来的所有其他值都是错误的或0。

以下是问题所在:

我最初“有点”通过重启服务器来修复它。这让我相信,每次调用lodctr后都必须重启,这是胡说八道(phew) 我想,它只是偶尔起作用,因为服务器上启动服务的顺序

事实证明,在它不起作用的服务器上,有多个进程具有相同的可执行名称,这意味着调用PerformanceCounter(“进程”,“%Processor Time”,Process.GetCurrentProcess().ProcessName)会得到完全的垃圾

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

当然,在#之后找到正确的号码有点棘手。 更糟糕的是:如果有人杀死了MyWebService#1,MyWebService#2的PerformanceCounters将开始监控以前的MyWebService#3的指标。而监控MyWebService#3的任何东西都会出现异常

来自.NET团队的好主意。与其像正常人一样使用进程ID,为什么不使用带有后缀的进程名称来标识进程呢

因此:

  • 您需要定期更新PerformanceCounter.InstanceName,以确保您仍然拥有正确的流程
  • 实际上,您需要另一个PerformanceCounter来获得正确的InstanceName,结果是速度慢得可笑
  • 搜索“PerformanceCounter multiple Process Name”以获取更多有用的链接


    感谢@PavelAnikhouski的帮助,尽管如此

    您是否检查了本地化?如果您的Win server 2012不是英语,性能计数器可能会失败。是否存在任何异常?您也可以尝试使用Windows性能监视工具监视计数器值,可能计数器本身存在问题。很遗憾,没有异常。我实际上,我认为本地化是一个问题,所以我用假值替换了计数器名称和进程名称,以查看在这种情况下会发生什么,它引发了一个异常,导致应用程序崩溃。当我在服务器上运行应用程序时,这一切都没有发生:(@PavelAnikhouski我能够使用powershell读取计数器。因此,它们似乎在工作。请尝试使用
    PdhLookupPerfNameByIndex
    函数获取计数器的实际名称。此外,如果从错误的文件夹(system32而不是syswow64,反之亦然)运行重建缓存,lodctr命令可能会失败。有一个代码段,我们在发生致命错误时使用它