【问题标题】:Negative CPU Usage using TimeStamp_Sys100NS使用 TimeStamp_Sys100NS 的负 CPU 使用率
【发布时间】:2012-07-18 09:48:05
【问题描述】:

我查看了WMI, negative CPU usage value and Timestamp_Sys100NS in past,但我没有做任何事情,启动时间只有两个读数之间的增量时间。

当 CPU 使用率非常低时,即系统空闲进程显示为 99%,我得到负 CPU 使用率读数。

我改编了一篇 MSDN 文章中的代码和公式,但不知道为什么它可能是错误的。

http://msdn.microsoft.com/en-us/library/aa392397%28VS.85%29.aspx

底部注释掉的行只给了我 0 或 100 的结果,我认为这是因为整数舍入或类似的东西,所以我在除法之前将它分成单独的部分作为双精度数。

        ulong N1 = 0;
        ulong D1 = 0;
        ulong N2 = 0;
        ulong D2 = 0;

        ManagementScope scope = new ManagementScope("\\\\" + Machine + "\\root\\cimv2");
        scope.Connect();

        WqlObjectQuery wqlQuery = new WqlObjectQuery("SELECT PercentProcessorTime, TimeStamp_Sys100NS FROM Win32_PerfRawData_PerfOS_Processor Where Name = '_Total'");
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, wqlQuery);

        foreach (ManagementObject proc in searcher.Get())
        {
            N1 = ulong.Parse(proc.Properties["PercentProcessorTime"].Value.ToString());
            D1 = ulong.Parse(proc.Properties["TimeStamp_Sys100NS"].Value.ToString());
        }

        System.Threading.Thread.Sleep(500);

        foreach (ManagementObject proc in searcher.Get())
        {
            N2 = ulong.Parse(proc.Properties["PercentProcessorTime"].Value.ToString());
            D2 = ulong.Parse(proc.Properties["TimeStamp_Sys100NS"].Value.ToString());
        }


        double cpu = N2 - N1;
        double time = D2 - D1;
        var x = (1 - (cpu / time)) * 100;
        //var x = (1 - ((N2 - N1) / (D2 - D1))) * 100;
        context.Response.Write(x);

【问题讨论】:

  • 您需要为每个单独的处理器内核执行此操作以获得有意义的数字。
  • 你的意思是你不能为 '_Total' 运行它?

标签: c# wmi wql


【解决方案1】:

我遇到了完全相同的问题,我在示例中使用 Perl,但您在下面看到的逻辑是相同的,我使用了 that Microsoft document 中描述的公式。

$average = (1 - ( ($n2-$n1) / ($d2-$d1) ) ) * 100;

我试图解决这个问题好几天,但最后我只找到了最明显的解决方案:

if ($average <0) { $average = 0; }

最后,如果 CPU 非常低,没人真正关心。就我而言,我正在寻找负载峰值和远程负载。也许你对我不知道的小变化感兴趣,对我来说 1% 或 0% 完全一样。

【讨论】:

  • 我只是更担心如果它是错误的,那么它在哪里和多少都是错误的。我设法在某一点上获得了 -2.3% 的 CPU 使用率,公平地说,这并不多,但我想做一些长期平均,以查看负载随时间的变化,并且每月(每月)增加 2% 可能是显着的,如果您需要计划在最大化服务器之前扩展某些东西。但是我无法判断它是否只是抖动。我决定改用 .Net Performance Monitor 对象,因为这看起来很准确,而且我不必自己计算。
  • 从我的测试中,我只得到了几次负值,而且只有在 CPU 几乎空闲时。在这种情况下,您可以删除该值并等待下一个值,而不是将 0 作为值。此外,如果您可以更改架构,还有更好的方法来计算 CPU 使用率(例如,您提到了 .Net Performance Monitor)。不幸的是,我不能,因为我是从远程服务器检索这些信息,而 WMI 和 SNMP 是唯一可能的方法。
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
相关资源
最近更新 更多