在.NET中使用PerformanceCounter来测量CPU使用率的正确方法

我想在Web服务中衡量业务类的性能。 我怎么能通过编码来做到这一点?

我想知道我的业务类消耗多少CPU来执行其操作,以及如果Web服务获得多个同时服务调用,性能如何变化。

我不想衡量我的网络服务的表现; 我只是想知道我的商务舱是如何表现的。

我的想法:

在阅读了一些博客之后,我决定编写一些代码来创建一个PerformanceCounter ,如下所示。 从该代码中,我可以在一个for循环中创建多个线程。 每个线程都会调用我的类。 在同一个for循环中,我将在计数器实例上调用NextValue()方法。

 System.Diagnostics.PerformanceCounter CpuCounter = new System.Diagnostics.PerformanceCounter(); CpuCounter.CategoryName = "Process"; CpuCounter.CounterName = "% Processor Time"; CpuCounter.InstanceName = Process.GetCurrentProcess().ProcessName; 

问题:

  1. 这种方法是否正确?
  2. 我应该使用“处理”类别还是“处理器”类别?
  3. 如何获取性能数据以创建一些报告? 例如,同时拥有100个线程,CPU使用率为70%,200个线程使用率达到90%等。
  4. 我的业务逻辑很快就结束了。 另一方面, NextValue()方法在本博客中提到的一秒间隔后给出正确的值。 我怎么处理这个?
  5. 有时, NextValue()方法给出的值大于100.这是否意味着CPU使用率超过100%? (我认为,此计数器的值不应解释为CPU的使用百分比。我是否正确?)

注意:我使用的是Windows 7 premium和Intel Core i5处理器。 这是我第一次使用性能计数器。 所以有些问题可能很愚蠢。

我已按顺序回答了您的问题:

1:如果您的业务类是在分析期间活动的唯一部分,是的。 但是,Perfmon最适合大规模分析entier应用程序,它并不是真正针对特定方法设计的。 要了解完成BusinessClass.Work()需要多少CPU周期,最好使用JetBrains dotTrace或Redgate的ANTS分析器。 这两种产品都提供免费试用。

2:过程是你正在做的正确的反击

3:您可以添加自己的计数器,或在时间片中执行测试。 更简单的方法是使用时间片方法,您可以在其中运行一系列测试,在每次测试之间仅更改单个变量。 在测试之间等待5-10秒没有任何活动,这使你在perfmon图中有一个很好的rest时间。 您还需要设置性能计数器日志, 此处将对此进行说明。

4:参见答案1,分析器对于方法级别的时序要好得多

5:这是预料之中的。 您的最大CPU%实际上是100 *处理器计数。 因此,如果你的i5是双核心,最大值是200%,如果它是400%的四倍等等……

请让我知道,如果你有任何问题。