为啥 cpu 性能计数器一直报告 0% cpu 使用率?

Posted

技术标签:

【中文标题】为啥 cpu 性能计数器一直报告 0% cpu 使用率?【英文标题】:Why the cpu performance counter kept reporting 0% cpu usage?为什么 cpu 性能计数器一直报告 0% cpu 使用率? 【发布时间】:2011-01-12 00:22:11 【问题描述】:
PerformanceCounter cpuload = new PerformanceCounter();
cpuload.CategoryName = "Processor";
cpuload.CounterName = "% Processor Time";
cpuload.InstanceName = "_Total";
Console.WriteLine(cpuload.NextValue() + "%");

输出总是 0%,而cpuload.RawValue 就像 736861484375 左右,NextValue() 发生了什么?

【问题讨论】:

【参考方案1】:

首先检索第一个值(将是 0)

NextValue();

然后等待 1000 毫秒

Thread.Sleep(1000);

然后检索第二个值,这是真正的 cpu 使用情况。

NextValue();

代码应如下所示:

float perfCounterValue = perfCounter.NextValue();

//Thread has to sleep for at least 1 sec for accurate value.
System.Threading.Thread.Sleep(1000);

perfCounterValue = perfCounter.NextValue();

Console.WriteLine("Value: 0", perfCounterValue);

【讨论】:

【参考方案2】:

计数器的第一次迭代将始终为 0,因为它与最后一个值没有可比性。试试这个:

var cpuload = new PerformanceCounter("Processor", "% Processor Time", "_Total");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");
Console.WriteLine(cpuload.NextValue() + "%");

然后你应该会看到一些数据出来了。它可以在恒定图表或更新场景中看到...这就是为什么您不会经常遇到此问题的原因。

这是MSDN reference:

方法 nextValue() 总是返回 第一次调用时为 0 值。那么你 必须再次调用此方法 时间。

【讨论】:

以上是关于为啥 cpu 性能计数器一直报告 0% cpu 使用率?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 VS 2010 性能分析器中捕获 CPU 指标

cpu正常,但是%util 一直是100,为啥?

用 64 位替换 32 位循环计数器会在 Intel CPU 上使用 _mm_popcnt_u64 引入疯狂的性能偏差

Python CPU 使用率降至 0%,在脚本执行期间击键后恢复

如何判断CPU内存磁盘的性能瓶颈?

获取进程的 CPU 和内存使用情况的正确性能计数器是啥?