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

3
我想要通过编码来衡量我在Web服务中的商业类性能。如何实现?
我想知道我的商业类使用了多少CPU来执行其操作,如果Web服务接收到多个同时服务调用,性能会如何变化。
我不想测量我的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. 我应该使用"Process"类别还是"Processor"类别?
  3. 如何获取性能数据以创建某些报告?例如,使用100个同时线程时,CPU使用率为70%,使用200个线程时,它会提高到90%等。
  4. 我的业务逻辑非常快。另一方面,NextValue()方法按照博客中所述,每隔一秒才会给出正确的值。我该如何处理?
  5. 有时,NextValue()方法给出的值超过100。这是否意味着CPU使用率超过了100%?(我认为,不应将此计数器的值解释为CPU的百分比使用率。我正确吗?)

注意:我使用的是Windows 7 premium和Intel Core i5处理器。这是我第一次使用性能计数器。因此,有些问题可能很幼稚。

1个回答

4

我按照顺序回答了你的问题:

1:如果你的Business Class是应用程序中唯一活动的部分,那么是的。但是,Perfmon最适合大规模地对整个应用程序进行性能分析,它并不是为特定方法而设计的。要找出完成BusinessClass.Work()所需的CPU周期数,最好使用JetBrains dotTrace或Redgate的ANTS Profiler等类似工具。这些产品都提供免费试用。

2:Process是你所做的事情的正确计数器

3:你可以添加自己的计数器,或者在时间片中执行测试。更简单的方法是时间片方法,在这种方法中,你基本上运行一系列测试,仅在每个测试之间更改一个变量。在测试之间等待5-10秒钟没有活动,这会给你的perfmon图表一个良好的休息时间。你还需要设置性能计数器日志,这在这里有解释。

4:请参见答案1,性能分析器更适合方法级别的计时

5:这是预期的。你的最大CPU%实际上将是100 *处理器计数。因此,如果你的i5是双核心,最大值为200%,如果是四核心,则为400%等等...

如果有任何问题,请告诉我。


感谢您的回答并提到了像dotTrace这样的工具。那么使用Process.TotalProcessorTime属性解决这个问题如何? - Learner
没问题。使用TotalProcessorTime属性应该是可行的,但你需要确保运行很多次你的方法来过滤应用程序启动、Jit等方面的噪音...1000万通常是一个不错的起点。 - Chris
关于第五点:我检查了我的处理器规格(Intel core i7 2640M),它只有2个核心和4个线程。然而,我的进程的性能计数器有时会给出超过800的“%处理器时间”值。这意味着第5点存在一些误解或错误。 - Learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接