2012-03-08 37 views
0

嗨,我想獲得CPU負載,但我越來越接受每個值更多然後100%不明白我在做什麼錯誤..。我沒有得到cpu的百分比linux的負載java

因爲我使用的酷睿i3以及它和一個虛擬機有兩個虛擬機我正在做這個任務我的源代碼,

public class PerformanceMonitor { 

    static long lastSystemTime  = 0; 
     static long lastProcessCpuTime = 0; 
     public static int availableProcessors = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors(); 
     // public static int availableProcessors = Runtime.getRuntime().availableProcessors(); 
     public synchronized double getCpuUsage() 
     { 
      ManagementFactory.getThreadMXBean().setThreadCpuTimeEnabled(true); 
      if (lastSystemTime == 0) 
      { 
       baselineCounters(); 
       // return ; 
      } 

      long systemTime  = System.nanoTime(); 
      long processCpuTime = 0; 

      processCpuTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime(); 
      double cpuUsage = (double) (processCpuTime - lastProcessCpuTime)/(systemTime - lastSystemTime)*100.0; 

      lastSystemTime  = systemTime; 
      lastProcessCpuTime = processCpuTime; 

      return cpuUsage/availableProcessors; 
     } 

     private void baselineCounters() 
     { 
      lastSystemTime = System.nanoTime(); 

      lastProcessCpuTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime(); 
     } 



     } 

,我在我的代碼使用這個類,

public static void main(String[] args) { 

      monitor = new PerformanceMonitor(); 
      for(int i=0 ; i<10000 ; i++){ 
       start(); 
       double usage = monitor.getCpuUsage(); 
       if(usage!=0)System.out.println("Current CPU usage in pourcentage : "+usage); 
      } 
     } 

     private static void start() { 
      int count=0; 
      for(int i=0 ; i<100000 ; i++){ 
       count=(int) Math.random()*100; 
      } 
     } 
} 

我得到這樣的輸出,

Current CPU usage in pourcentage : 114.32926829268293 
Current CPU usage in pourcentage : 48.70208931963182 
Current CPU usage in pourcentage : 193.08746862328633 
Current CPU usage in pourcentage : 236.85457129322594 

希望您的建議在此先感謝

回答

1

我懷疑間隔太短。 Linux上的cpu計數器每秒只更新100次,你可能會在大約1/100秒執行循環,這意味着你得到一個非常大的錯誤。嘗試增加循環的長度,以便延長几秒鐘。


我做了測試時間更長,取出/ availableProcessors,我得到這樣

Current CPU usage in percentage : 99.95763231535723 
Current CPU usage in percentage : 99.94895863534565 
Current CPU usage in percentage : 99.40642907762789 
Current CPU usage in percentage : 99.96184668521532 
Current CPU usage in percentage : 99.89017532820115 
Current CPU usage in percentage : 99.91157680329947 
Current CPU usage in percentage : 99.96919753553432 
Current CPU usage in percentage : 99.94121334997978 
+0

數字我一直搞不明白什麼是你想告訴我,我得到的值,因爲有保險業監督while循環實際上我只能得到一個值,那麼如果它基於循環持續時間會發生什麼? – 2012-03-08 09:09:12

+0

期限越短,結果越不準確。對於接近0.01秒的持續時間來說,這是非常不準確的,並且比這更少是毫無意義的。 – 2012-03-08 09:26:17

+0

Pete我想在5分鐘後得到這個值,然後在5分鐘後再次得到一個值,然後對於這個patren,我該怎麼做才能獲得準確的值? – 2012-03-08 09:47:36