java - 如何使用 java 程序或 JMX 获取远程计算机的系统总 CPU 使用百分比

标签 java monitoring jmx cpu-usage

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

最佳答案

我使用这段代码片段通过从 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; 
 }

  }

关于java - 如何使用 java 程序或 JMX 获取远程计算机的系统总 CPU 使用百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9213207/

相关文章:

java - 在 Java 中生成全局唯一标识符

java - Android 应用程序连接到数据库

oracle - 在Oracle数据库中存储重复时间段

javascript - 错误监控缩小的 javascript

security - 将 JMX 限制到本地主机

java - jmx 如何帮助开发高度可扩展的分布式应用程序?

c# - 字段相等需要什么条件?

java - 更改javamelody的存储目录

java - OperatingSystemMXBean CPU使用方法

java - 在客户端开发期间使用 Cassandra 进行测试