2012-07-18 123 views
2

我已經看過WMI, negative CPU usage value and Timestamp_Sys100NS in past但我沒有做任何與兩次讀數之間的啓動時間只增量時間。使用TimeStamp_Sys100NS負CPU使用率

當CPU使用率非常低時,即System Idle Process顯示爲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); 
+0

您需要爲每個單獨的處理器內核執行此操作以獲取有意義的數字。 – 2012-07-18 12:41:27

+0

你的意思是你不能爲'_Total'運行它? – Matt 2012-07-18 14:17:51

回答

1

我有完全相同的問題,我用Perl工作在例如但你可以看到下面的邏輯是相同的,我用that Microsoft document描述的公式。

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

我試圖解決這個好幾天,但最終我只是去爲最明顯的解決方案:

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

最終如果CPU是非常低的,沒有人真正關心。在我的情況下,我正在尋找負載尖峯和遠程負載。也許你對我不知道的小變化感興趣,對我來說1%或0%是完全一樣的。

+0

我只是更擔心,如果它是錯的,那麼它在哪裏和多少有錯誤。我設法得到-2.3%的CPU使用率,雖然不是很多,但我想要做一些長期平均來看看隨着時間的推移負載變化,如果每月(每月)增加2%您需要計劃在最大化服務器之前擴展某些內容。但是我無法分辨它是否只是抖動。我決定使用.Net性能監視器對象,因爲這看起來很準確,我不必自己計算它。 – Matt 2012-07-24 11:36:23

+0

那麼從我的測試中,我只有幾次,只有當CPU幾乎空閒時纔得到負值。在這種情況下,不要把0作爲一個值,你可以放下這個值並等待下一個值。除了可以更改體系結構之外,還有更好的方法來計算CPU使用率(例如,您提到.Net性能監視器)。不幸的是,我不能從遠程服務器檢索這些信息,WMI和SNMP是唯一可能的方式。 – raz3r 2012-07-24 12:37:17