2

私は過去に WMI、負の CPU 使用率の値、および Timestamp_Sys100NS を見てきましたが、起動時間だけで 2 つの読み取り値の間のデルタ時間については何もしていません。

CPU 使用率が非常に低い場合、つまりシステム アイドル プロセスが 99% と表示される場合、CPU 使用率の読み取り値がマイナスになります。

MSDN の記事のコードと式を採用しましたが、なぜ間違っているのかわかりません。

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

一番下のコメントアウトされた行は、0 または 100 の結果しか与えていませんでした。これは、整数の丸めまたは同様のものが原因であると思われるため、分割する前に double として別々の部分に分割しました。

        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);
4

1 に答える 1

1

私はまったく同じ問題を抱えていました。例ではPerlを使用していますが、以下に示すロジックは同じです。そのMicrosoftドキュメントで説明されている式を使用しました。

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

私はこれを何日も解決しようとしましたが、最終的に最も明白な解決策に行きました:

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

結局、CPU の使用率が非常に低くても、誰も気にしません。私の場合、負荷スパイクと長距離負荷を探していました。たぶん、あなたは私が知らない小さな変化に興味を持っています.1%または0%はまったく同じです.

于 2012-07-24T10:24:57.277 に答える