使用TimeStamp_Sys100NS的负CPU使用率

时间:2012-07-18 09:48:06

标签: c# wmi wql

我看过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);

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

相关问题