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

问题描述 投票:0回答:1

我正在使用.NETs System.Diagnostics.PerformanceCounter类来检索Web服务进程的内存使用情况和%CPU时间。

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

  • 0表示PerformanceCounter(“进程”,“%处理器时间”,Process.GetCurrentProcess()。ProcessName)
  • 对于PerformanceCounter来说“大多数”为0(“处理器”,“%处理器时间”,“_总计”)(间歇性地,我在那里获得正确的值,但是每10个左右的值实际上只有0以外的数字
  • PerformanceCounter(“Process”,“Working Set”,p.ProcessName)的完全伪造(并且不随实际使用而变化)值(事实上,无论负载如何,该值在应用程序完全重启时仍保持为44 MB。服务。

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

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

  • 检查是否有“禁用性能监视器”注册表项(未找到)
  • 使用lodctr / R重建性能计数器设置
  • 使用提升的权限运行应用程序
  • 将运行应用程序的用户添加到“性能监视器用户”组
  • 将运行应用程序的用户添加到“Performance Log Users”组
  • 在Powershell中运行获取计数器 - “处理器(*)\%处理器时间” - >每次调用都获得有效数字(但第一个,这没关系)

我错过了什么?例如,与PerformanceCounters返回错误值或0相关的大多数答案都与NextValue仅被调用一次有关。这不是这种情况(这使得寻找解决方案有点困难)。我非常清楚这个限制,我不希望第一个值返回非零。接下来的所有其他值都是错误的或0。

c# performance counter performancecounter
1个回答
1
投票

结果就是这个问题:

我最初“有点”通过重新启动服务器修复它。这让我相信你必须在每次调用lodctr之后重新启动这是无意义的(phew)它只是偶尔工作,因为服务器上启动服务的顺序,我猜...

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

假设你有三个服务在运行,都使用相同的可执行文件名“MyWebService.exe”,但它们可能都在不同的位置,使用不同的配置等,然后你需要使用InstanceName为“MyWebService#”调用PerformanceCounter 1“,”MyWebService#2“等。

当然,在#之后找到合适的号码是有点棘手的。更糟糕的是:如果有人杀死了MyWebService#1,MyWebService#2的PerformanceCounters将开始监控曾经是MyWebService#3的指标。无论监控什么,MyWebService#3都会出现异常。

来自.NET团队的好主意。为什么不使用带有后缀的进程名来代替o_O来识别进程,而不是像理智的人一样使用进程ID

所以:

  1. 您需要定期更新PerformanceCounter.InstanceName以确保您仍然获得正确的流程
  2. 你实际上需要另一个PerformanceCounter来获得正确的InstanceName,结果是非常慢。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.