我正在使用.NETs System.Diagnostics.PerformanceCounter类来检索Web服务进程的内存使用情况和%CPU时间。
在我的Win10开发机器上本地运行代码,调用NextValue()会返回正确的值。一旦我将二进制文件移动到Windows Server 2012计算机,我就得到了
没有抛出异常表明我使用了错误的计数器名称或进程名称。
这是我尝试过的(没有成功)
我错过了什么?例如,与PerformanceCounters返回错误值或0相关的大多数答案都与NextValue仅被调用一次有关。这不是这种情况(这使得寻找解决方案有点困难)。我非常清楚这个限制,我不希望第一个值返回非零。接下来的所有其他值都是错误的或0。
结果就是这个问题:
我最初“有点”通过重新启动服务器修复它。这让我相信你必须在每次调用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
所以:
搜索“PerformanceCounter多个进程名称”以获取更多有用的链接
尽管如此,谢谢@PavelAnikhouski的帮助