我正在使用.NETs System.Diagnostics.PerformanceCounter类检索Web服务进程的内存使用率和CPU时间百分比。
在Win10开发计算机上本地运行代码,调用NextValue()返回正确的值。将二进制文件移至Windows Server 2012计算机后,我立即得到
没有引发异常,表明我使用了错误的计数器名称或进程名称。
这就是我尝试过的(没有成功)
我想念什么?例如,与PerformanceCounters返回错误值或0有关的大多数答案与NextValue仅被调用一次有关。这里不是这种情况(这使得找到解决方案有些困难)。我非常了解该限制,并且我不希望要返回的第一个值非零。随之而来的所有其他值都是错误的或为0。
答案 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
所以:
搜索“ PerformanceCounter多个进程名称”以获得更多有用的链接
感谢@PavelAnikhouski的帮助