PerformanceCounter类别和反制混淆

时间:2016-05-13 20:32:18

标签: c# .net performancecounter

我正在尝试确定我的进程在我编写的性能API中使用的线程数。我知道我可以使用Process.GetCurrentProcess.Threads集合,但我一直在尝试将PerformanceCounter用于我们想要监控的所有不同指标。

我已经能够使用以下计数器获得CPU处理时间:

this.counter = new PerformanceCounter();
counter.CategoryName = "Processor";
counter.CounterName = "% processor Time";
counter.InstanceName = "_Total";

现在我想跟踪当前进程的线程计数。我做了一些阅读,并将CategoryName标识为来自MSDN article主题

  

虽然您的系统提供了更多可用的计数器类别,但您可能最常与之交互的类别是缓存,内存,对象,物理磁盘,进程,处理器,服务器,系统和线程类别。

但是当我使用Thread值作为类别时,我会收到以下InvalidOperationException

  

找不到具有指定类别名称'Thread'的计数器计数器,计数器名称'Thread Count'

所以我将类别更改为Process并使用以下代码运行:

this.counter = new PerformanceCounter();
counter.CategoryName = "Process";
counter.CounterName = "Thread Count";
counter.InstanceName = "_Total";

这给了我2000以上的值,在某些情况下,我得到一个奇怪的小数值,考虑到你有一个线程或你没有。不是一个百分比。当我使用Process.GetCurrentProcess.Threads时,我发现在使用计数器时我已经运行了15次,因此2,000+号码已经开始了。我做错了什么?

我正在使用性能监视器来识别可用的计数器,并尝试为每个计数器构建一个类,对于许多这些计数器。我有一个接口IMetric,我想在后面实现十几个计数器。当我确定我想要的计数器时,如何确定我应该使用的CategoryName的任何指导都会很棒。似乎使用类别,当我尝试使用它时,perfmon中的计数器被分组,我尝试使用的类别也都没有。所有指标都适用于当前正在运行的流程,因此我的CategoryName始终只是流程吗?

修改

当我在perfmon中使用线程计数计数器时,我看到大致正确的线程数(尽管分数仍然看起来很奇怪)。为什么当我使用这个计数器时,我看到2000+?如果我将InstanceName更改为Process.GetCurrentProcess().ProcessName,我会看到28到30之间的范围,这与perfmon给出的平均值不匹配。这似乎是一个更现实的数字。它仍然与Process.GetCurrentProcess().Threads不匹配,我不确定它是否应该。

enter image description here

0 个答案:

没有答案