shagul
shagul

Reputation: 151

How to get a System's total CPU usage percentage of a remote computer using a java program or JMX

Hi in my system there will be a master node and n number of slave nodes. The master node will forward the incoming request to one of its slave nodes. I want to find the CPU usage of all its slave node, So that i can forward the request to the appropriate node. I have found similar question like this in that they answered to use getCpuUsage() to find. But when i use it am getting an error like cannot find symbol: getCpuUsage(). Can any one please suggest me how can i find the cpu usage percentage (of the slave node with their i.p address). Thanks in advance.

Upvotes: 0

Views: 4440

Answers (1)

landal79
landal79

Reputation: 1520

I used this snipped of code to compute cpu load with java 1.5 extracted from jconsole:

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; 
 }

  }

Upvotes: 1

Related Questions