【问题标题】:PerformanceCounter.NextValue() returns constant value for CPU loadPerformanceCounter.NextValue() 返回 CPU 负载的常量值
【发布时间】:2015-12-25 19:19:49
【问题描述】:

我正在尝试推出自己的系统性能监视器,以便在过载的情况下延迟执行部分服务器代码(在 IIS 下运行一些 Web 服务)。我要解决的第一件事是 CPU 过载。

我知道PerformanceCounter 的问题是必须在第一次调用NextValue() 时对其进行初始化(请参阅this question 等),因此我实现了一个非常简单的静态类,可以将数据缓存一秒钟,并且实际上每秒或更少访问一次PerformanceCounter 对象。我知道它目前不是线程安全的,但在当前的原型设计阶段我并不关心。

所以,说了这么多,这是我当前的代码:

public static class SystemPerformance
{
    private static PerformanceCounter TotalProcessorTimeCounter =
        new PerformanceCounter("Process", "% Processor Time", "_Total");
    private static DateTime CacheRefreshed;
    private static float CachedValue = 0f;
    private const float MIN_DELTA_SECONDS = 1f;

    public static float ReadCPU()
    {
        if ((DateTime.Now - CacheRefreshed).TotalSeconds > MIN_DELTA_SECONDS)
            // Stale cache
            return ReadFromCounter();

        // Good cache
        return CachedValue;
    }

    private static float ReadFromCounter()
    {
        CachedValue = TotalProcessorTimeCounter.NextValue();
        CacheRefreshed = DateTime.Now;
        return CachedValue;
    }
}

...在我执行之前,这一切都很好而且很花哨。我尝试在具有 4 核的 Windows 10 x64 VM 和具有 4 核的 Windows 7 x64 Iron 上运行它——在这两种情况下,无论我做什么,返回值都徘徊在 400 左右。

我得到的典型值在 395–401 范围内,偶尔下降到 365 或跳到 405。我读取的值与我测试的任何一台机器上的实际 CPU 负载没有任何关系,如任务管理器、性能监视​​器或实际上的常识所示。

测试方法很简单:SystemPerformance.ReadCPU() 在简单的 Windows 表单中由按下按钮触发,输出显示在相同表单的文本框中。我在 CPU 准空闲时按下该按钮,并且在 其他进程 正在执行操作并加载 CPU 时按下它。

我做错了什么?这应该只返回我的应用程序线程的 CPU 使用率吗?我是否误解了数据?

【问题讨论】:

  • fyi CacheRefreshed == null 永远不会为真,因为DateTime 不能为空。
  • 好点,谢谢;从代码中删除了该测试。
  • “盘旋”,所以它改变了吗?还是恒定的?
  • 如前所述,它会发生变化。如果您是在暗示技术上不准确的标题,我不想让它比现在更长。

标签: c# cpu-usage performancecounter


【解决方案1】:
   new PerformanceCounter("Process", "% Processor Time", "_Total");

是的,_Total 进程数所占用的处理器时间,包括您在任务管理器中看到的虚假“系统空闲进程”,在 4 核机器上总是加起来为 400%。

如果您将“进程”更改为“处理器”,您可能会更喜欢这个数字。如果要匹配任务管理器显示的值,则需要将“进程”更改为“处理器信息”。一个新类别,它试图生成一个更真实的数字,以补偿具有涡轮增压的处理器、具有 NUMA 节点的机器以及您从超线程获得的较低性能。您需要阅读this blog post 了解细节。

【讨论】:

  • 呸呸呸!谢谢,我不会注意到的!对于奖励积分(我实际上无法授予),有什么类似于 Unix 的“负载”概念吗?由于我的最终目标是在 CPU 过载时延迟执行某些内容,因此我显然更愿意在它过度使用时告诉我一些东西,而不是简单地使用一个对未充分使用更有用的 0-100% 指示器。 .
猜你喜欢
  • 2014-04-11
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2018-05-07
相关资源
最近更新 更多