2012-02-09 9 views
0

私のシステムでは、マスターノードとn個のスレーブノードが存在します。マスタノードは、着信要求をそのスレーブノードの1つに転送する。私はすべてのスレーブノードのCPU使用率を見たいので、私は適切なノードに要求を転送することができます。私はgetCpuUsage()を使用して見つけ出すと答えた点で、これと同様の問題を発見しました。しかし、私が使用すると、シンボルを見つけることができないようなエラーが発生しています:getCpuUsage()。どの人が私のCPU使用率を(i.pアドレスのスレーブノードの)パーセンテージで見つけることができますか?前もって感謝します。JavaプログラムまたはJMXを使用してリモートコンピュータのシステム全体のCPU使用率を取得する方法

答えて

1

私はjconsoleをから抽出したJava 1.5でCPUの負荷を計算するためのコードのこのスニップを使用:

public class CPULoad { 

     private static long prevUpTime, prevProcessCpuTime; 

     private static RuntimeMXBean rmBean;   

     private static com.sun.management.OperatingSystemMXBean sunOSMBean; 

     private static Result result; 

     private static class Result { 
     long upTime = -1L; 
     long processCpuTime = -1L; 
     float cpuUsage = 0; 
       int nCPUs;  
     } 

     static{ 
     try { 
     rmBean = ManagementFactory.getRuntimeMXBean();        
     //reperisco l'MBean relativo al sunOS 
     sunOSMBean = ManagementFactory.newPlatformMXBeanProxy(
        ManagementFactory.getPlatformMBeanServer(), 
         ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, 
        com.sun.management.OperatingSystemMXBean.class 
       );   

     result = new Result(); 
     result.nCPUs = sunOSMBean.getAvailableProcessors(); 
     result.upTime = rmBean.getUptime(); 
     result.processCpuTime = sunOSMBean.getProcessCpuTime(); 

     }catch(Exception e){ 
      System.err.println(CPULoad.class.getSimpleName()+" exception: "+e.getMessage());   
     } 
    } 


    public CPULoad(){ } 


    public float getCPULoad(){ 

    result.upTime = rmBean.getUptime(); 
    result.processCpuTime = sunOSMBean.getProcessCpuTime(); 

    if(result.upTime > 0L && result.processCpuTime >= 0L) 
     updateCPUInfo(); 

    return result.cpuUsage; 

    } 

    public void updateCPUInfo() { 
    if (prevUpTime > 0L && result.upTime > prevUpTime) { 
     // elapsedCpu is in ns and elapsedTime is in ms. 
     long elapsedCpu = result.processCpuTime - prevProcessCpuTime; 
     long elapsedTime = result.upTime - prevUpTime; 
     // cpuUsage could go higher than 100% because elapsedTime 
     // and elapsedCpu are not fetched simultaneously. Limit to 
     // 99% to avoid Plotter showing a scale from 0% to 200%. 
     result.cpuUsage = 
      Math.round(
       Math.min(100F, 
         elapsedCpu/(elapsedTime * 10000F * result.nCPUs) 
         ) 
        );      
    } 

    prevUpTime = result.upTime; 
    prevProcessCpuTime = result.processCpuTime; 
} 

    } 
+0

これは本当にCPUの負荷を計算しません。 CPUが現在のJavaプロセスでビジー状態になっている時間だけをカウントしますが、他のプロセスではカウントされません。 –

+0

あなたのコードをありがとうございました。しかし、これは現在のマシンにCPU負荷があるようです。しかし、どのようにネットワークに接続されるスレーブノードのCPU負荷を見つけるか。リモートアクセスを介してスレーブノードのCPU負荷を見つけることは可能ですか? – shagul

関連する問題