【问题标题】:How to get a System's total CPU usage percentage of a remote computer using a java program or JMX如何使用 java 程序或 JMX 获取远程计算机的系统总 CPU 使用百分比
【发布时间】:2012-02-09 15:00:16
【问题描述】:

嗨,在我的系统中会有一个主节点和 n 个从节点。主节点将传入请求转发到其从节点之一。我想找到它所有从节点的 CPU 使用率,以便我可以将请求转发到适当的节点。我发现了类似的问题,因为他们回答使用 getCpuUsage() 来查找。但是当我使用它时,会出现一个错误,比如找不到符号:getCpuUsage()。任何人都可以建议我如何找到CPU使用百分比(从节点的IP地址)。提前致谢。

【问题讨论】:

    标签: java monitoring jmx cpu-usage


    【解决方案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; 
     }
    
      }
    

    【讨论】:

    • 这并不真正计算 CPU 负载。它只计算 cpu 忙于当前 Java 进程的时间,而不计算其他任何进程的时间。
    • 非常感谢您的代码。但这似乎找到了当前机器上的cpu负载。但是如何找到slave节点的cpu负载,会在网络中连接。是否可以通过远程访问找到从节点的cpu负载..?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2020-11-27
    • 2017-10-16
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多