C# PerformanceCounter在某些计算机上不返回值
我正在使用.NETs System.Diagnostics.PerformanceCounter类检索webservice进程的内存使用情况和CPU时间百分比 在我的Win10开发机器上本地运行代码,调用NextValue()返回正确的值。一旦我将二进制文件移动到Windows Server 2012机器上,我就会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
- 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,为什么不使用带有后缀的进程名称来标识进程呢 因此:
感谢@PavelAnikhouski的帮助,尽管如此您是否检查了本地化?如果您的Win server 2012不是英语,性能计数器可能会失败。是否存在任何异常?您也可以尝试使用Windows性能监视工具监视计数器值,可能计数器本身存在问题。很遗憾,没有异常。我实际上,我认为本地化是一个问题,所以我用假值替换了计数器名称和进程名称,以查看在这种情况下会发生什么,它引发了一个异常,导致应用程序崩溃。当我在服务器上运行应用程序时,这一切都没有发生:(@PavelAnikhouski我能够使用powershell读取计数器。因此,它们似乎在工作。请尝试使用
PdhLookupPerfNameByIndex
函数获取计数器的实际名称。此外,如果从错误的文件夹(system32而不是syswow64,反之亦然)运行重建缓存,lodctr命令可能会失败。有一个代码段,我们在发生致命错误时使用它