sigar 获取机器部分负载信息方法及问题解决
- 2025-09-23  黑龙江
- 本文字数:6453 字 - 阅读完需:约 21 分钟 
 
 @[TOC]
一、获取负载信息部分:
结果部分数据展示:
 
 ==⭐==详情请看点这里↓
相关代码如下:
pojo
import java.util.Date;
import com.geespace.microservices.calculate.execute.engine.bean.ModelField;
import lombok.Data;import lombok.EqualsAndHashCode;import lombok.ToString;
/** * ResourInformation * * @Author: liudz * @Date: 2019-11-07 **/@Data@EqualsAndHashCode(callSuper = false)@ToString(callSuper = true)public class MachineResourceInfo {
    /**     * cpuLoadDetails     */    @ModelField(name = "CPU负载详情信息", comment = "CPU负载详情信息", size = "500", required = false)    String cpuLoadDetails;    /**     * memoryLoadTotalUsePercent     */    @ModelField(name = "内存总使用百分比", comment = "内存总使用百分比", size = "500", required = false)    String memoryLoadTotalUsePercent;    /**     * memoryLoadTotal     */    @ModelField(name = "内存总量", comment = "内存总量", size = "500", required = false)    String memoryLoadTotal;    /**     * memoryLoadUsed     */    @ModelField(name = "当前内存使用量", comment = "当前内存使用量", size = "500", required = false)    String memoryLoadUsed;    /**     * memoryLoadFree     */    @ModelField(name = "当前内存剩余量", comment = "当前内存剩余量", size = "500", required = false)    String memoryLoadFree;    /**     * memoryExchangeTotal     */    @ModelField(name = "内存交换区总量", comment = "内存交换区总量", size = "500", required = false)    String memoryExchangeTotal;    /**     * memoryExchangeUsed     */    @ModelField(name = "内存当前交换区使用量", comment = "内存当前交换区使用量", size = "500", required = false)    String memoryExchangeUsed;    /**     * memoryExchangeFree     */    @ModelField(name = "内存当前交换区剩余量", comment = "内存当前交换区剩余量", size = "500", required = false)    String memoryExchangeFree;    /**     * diskLoad     */    @ModelField(name = "磁盘使用情况", comment = "磁盘使用情况", size = "500", required = false)    String diskLoad;    /**     * diskReadOrWrite     */    @ModelField(name = "磁盘读写", comment = "磁盘读写", size = "500", required = false)    String diskReadOrWrite;    /**     * jvmHeapMemoryMax     */    @ModelField(name = "JVM堆内存信息Max", comment = "JVM堆内存信息Max", size = "500", required = false)    String jvmHeapMemoryMax;    /**     * jvmHeapMemoryInit     */    @ModelField(name = "JVM堆内存信息Init", comment = "JVM堆内存信息Init", size = "500", required = false)    String jvmHeapMemoryInit;    /**     * jvmHeapMemoryCommitted     */    @ModelField(name = "JVM堆内存信息Committed", comment = "JVM堆内存信息Committed", size = "500", required = false)    String jvmHeapMemoryCommitted;    /**     * jvmHeapMemoryUsed     */    @ModelField(name = "JVM堆内存信息Used", comment = "JVM堆内存信息Used", size = "500", required = false)    String jvmHeapMemoryUsed;    /**     * jvmNonHeapMemoryMax     */    @ModelField(name = "JVM非堆内存信息Max", comment = "JVM非堆内存信息Max", size = "500", required = false)    String jvmNonHeapMemoryMax;    /**     * jvmNonHeapMemoryInit     */    @ModelField(name = "JVM非堆内存信息Init", comment = "JVM非堆内存信息Init", size = "500", required = false)    String jvmNonHeapMemoryInit;    /**     * jvmNonHeapMemoryCommitted     */    @ModelField(name = "JVM非堆内存信息Committed", comment = "JVM非堆内存信息Committed", size = "500", required = false)    String jvmNonHeapMemoryCommitted;    /**     * jvmNonHeapMemoryUsed     */    @ModelField(name = "JVM非堆内存信息Used", comment = "JVM非堆内存信息Used", size = "500", required = false)    String jvmNonHeapMemoryUsed;    /**     * jvmTotalMemory     */    @ModelField(name = "JVM已申请的内存量", comment = "JVM已申请的内存量", size = "500", required = false)    String jvmTotalMemory;    /**     * jvmFreeMemory     */    @ModelField(name = "JVM空闲的内存量", comment = "JVM空闲的内存量", size = "500", required = false)    String jvmFreeMemory;    /**     * jvmMaxMemory     */    @ModelField(name = "JVM最大可使用的内存量", comment = "JVM最大可使用的内存量", size = "500", required = false)    String jvmMaxMemory;    /**     * 数据产生时间     */    private Date createTime;}
接口
/**     * 获取机器资源信息     *     * @return MachineResourInformation 结果     * @author: liudz     * @date: 2020/4/25 16:45     */    MachineResourceInfo getMachineResourceInfo();
接口实现类
/**     * 向ES写机器负载信息,并返回给前端     *     * @return     * @author: liudz     * @date: 2020/4/25 16:53     */    @Override    public MachineResourceInfo getMachineResourceInfo() {        MachineResourceInfo machineResourInfo = null;        try {            machineResourInfo = addParameter1();            MachineResourceInfo finalMachineResourInfo = machineResourInfo;            esExecutorService.submit(() -> {                JSONObject params = (JSONObject) JSONObject.toJSON(finalMachineResourInfo);                ResponseEntity<JSONObject> response = HttpUtils.sendPostRequest(monitorUrl, params);                if (!response.getStatusCode().equals(HttpStatus.CREATED)) {                    log.error("spark write ES error:{}", response);                }            });        } catch (SigarException e) {            log.error("AccessEsLogServiceImpl--getMachineResourInfo--error!");        }        return machineResourInfo;    }
/**     * addParameter     *     * @return 结果     * @throws SigarException     *             SigarException     * @author: liudz     * @date: 16:52     */    public MachineResourceInfo addParameter1() throws SigarException {        MachineResourceInfo machineResourceInfo = new MachineResourceInfo();        Sigar sigar = new Sigar();        CpuInfo[] infos = sigar.getCpuInfoList();        CpuPerc[] cpuList = null;        cpuList = sigar.getCpuPercList();        String cpuLoadDetailsUsed = "";        for (int i = 0; i < infos.length; i++) {            cpuLoadDetailsUsed += "第" + (i + 1) + "块CPU总的使用率: " + CpuPerc.format(cpuList[i].getCombined()) + ", ";        }        Mem mem = sigar.getMem();        DecimalFormat df = new DecimalFormat("0.00");        Swap swap = sigar.getSwap();        FileSystem[] fslist = sigar.getFileSystemList();        String diskLoad = "";        String diskReadOrWrite = "";        for (int i = 0; i < fslist.length; i++) {            FileSystem fs = fslist[i];            FileSystemUsage usage = null;            usage = sigar.getFileSystemUsage(fs.getDirName());            double usePercent = usage.getUsePercent() * Double.parseDouble("100D");            diskLoad += fs.getDevName() + "总大小: " + usage.getTotal() + "KB, " + fs.getDevName() + "已经使用量: "                + usage.getUsed() + "KB, " + fs.getDevName() + "剩余大小: " + usage.getFree() + "KB, " + fs.getDevName()                + "资源的利用率: " + usePercent + "%";            diskReadOrWrite += fs.getDevName() + "读出:" + usage.getDiskReads() + "扇区, " + fs.getDevName() + "写入:"                + usage.getDiskWrites() + "扇区";        }        machineResourceInfo = addParameter2(df, mem, swap, diskLoad, diskReadOrWrite);        machineResourceInfo.setCpuLoadDetails(cpuLoadDetailsUsed);        return machineResourceInfo;    }
/**     * addParameter2     *     * @param df     *            df     * @param mem     *            mem     * @param swap     *            swap     * @param diskLoad     *            diskLoad     * @param diskReadOrWrite     *            diskReadOrWrite     * @return machineResourceInfo     * @author: liudz     * @date: 2020/4/27 10:27     */    public MachineResourceInfo addParameter2(DecimalFormat df, Mem mem, Swap swap, String diskLoad,        String diskReadOrWrite) {        MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();        MachineResourceInfo machineResourceInfo = new MachineResourceInfo();        machineResourceInfo.setCreateTime(new Date());        machineResourceInfo.setMemoryLoadTotalUsePercent(            "内存总使用百分比: " + df.format((float) mem.getUsed() / mem.getTotal() * Integer.parseInt("100")) + "%");        machineResourceInfo.setMemoryLoadTotal("内存总量:  " + mem.getTotal() / Integer.parseInt("1024") + "K av");
        machineResourceInfo.setMemoryLoadUsed("当前内存使用量:  " + mem.getUsed() / Integer.parseInt("1024") + "K used");        machineResourceInfo.setMemoryLoadFree("当前内存剩余量:  " + mem.getFree() / Integer.parseInt("1024") + "K free");        machineResourceInfo.setMemoryExchangeTotal("内存交换区总量:  " + swap.getTotal() / Integer.parseInt("1024") + "K av");        machineResourceInfo            .setMemoryExchangeUsed("内存当前交换区使用量:  " + swap.getUsed() / Integer.parseInt("1024") + "K used");        machineResourceInfo            .setMemoryExchangeFree("内存当前交换区剩余量:  " + swap.getFree() / Integer.parseInt("1024") + "K free");        machineResourceInfo.setDiskLoad(diskLoad);        machineResourceInfo.setDiskReadOrWrite(diskReadOrWrite);        machineResourceInfo.setJvmHeapMemoryMax("堆内存信息Max: "            + memorymbean.getHeapMemoryUsage().getMax() / Integer.parseInt("1024") / Integer.parseInt("1024") + " MB");        machineResourceInfo.setJvmHeapMemoryInit("堆内存信息Init: "            + memorymbean.getHeapMemoryUsage().getInit() / Integer.parseInt("1024") / Integer.parseInt("1024") + " MB");        machineResourceInfo.setJvmHeapMemoryCommitted("堆内存信息Committed: "            + memorymbean.getHeapMemoryUsage().getCommitted() / Integer.parseInt("1024") / Integer.parseInt("1024")            + " MB");        machineResourceInfo.setJvmHeapMemoryUsed("堆内存信息Used: "            + memorymbean.getHeapMemoryUsage().getUsed() / Integer.parseInt("1024") / Integer.parseInt("1024") + " MB");        machineResourceInfo.setJvmNonHeapMemoryMax("非堆内存信息Max: "            + memorymbean.getNonHeapMemoryUsage().getMax() / Integer.parseInt("1024") / Integer.parseInt("1024")            + " MB");        machineResourceInfo.setJvmNonHeapMemoryInit("非堆内存信息Init: "            + memorymbean.getNonHeapMemoryUsage().getInit() / Integer.parseInt("1024") / Integer.parseInt("1024")            + " MB");        machineResourceInfo.setJvmNonHeapMemoryCommitted("非堆内存信息Committed: "            + memorymbean.getNonHeapMemoryUsage().getCommitted() / Integer.parseInt("1024") / Integer.parseInt("1024")            + " MB");        machineResourceInfo.setJvmNonHeapMemoryUsed("非堆内存信息Used: "            + memorymbean.getNonHeapMemoryUsage().getUsed() / Integer.parseInt("1024") / Integer.parseInt("1024")            + " MB");        machineResourceInfo.setJvmTotalMemory("JVM已申请的内存量:  "            + Runtime.getRuntime().totalMemory() / Integer.parseInt("1024") / Integer.parseInt("1024") + " MB");        machineResourceInfo.setJvmFreeMemory("JVM空闲的内存量:  "            + Runtime.getRuntime().freeMemory() / Integer.parseInt("1024") / Integer.parseInt("1024") + " MB");        machineResourceInfo.setJvmMaxMemory("JVM最大可使用的内存量: "            + Runtime.getRuntime().maxMemory() / Integer.parseInt("1024") / Integer.parseInt("1024") + " MB");        return machineResourceInfo;    }
二、使用问题解答
第一种问题:在华为云 ARM 部署报错:org.hyperic.sigar.SigarException: no libsigar-aarch64-linux.so in java.libra
解决办法:遇到华为 ARM 服务器时,需要 libsigar-aarch64-linux.so 库支持 aarch64 平台,把“libsigar-aarch64-linux.so”放在 linux 下的   /usr/lib  和    /usr/lib64   下(都要进行拷贝)该朋友已经具体介绍,详情点击这里
第二种问题:使用该类常常会遇到问题:
java.lang.UnsatisfiedLinkError: org.hyperic.sigar.SysInfo.gather(Lorg/hyperic/sigar/Sigar;)Vorg.hyperic.sigar.SysInfo.gather(Native Method)org.hyperic.sigar.OperatingSystem.getInstance(OperatingSystem.java:90)com.shuhaiserver.page.servlet.LoginServlet.doLogin(LoginServlet.java:146)com.shuhaiserver.page.servlet.LoginServlet.doPost(LoginServlet.java:54)javax.servlet.http.HttpServlet.service(HttpServlet.java:637)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)com.shuhaiserver.page.servlet.MyFilter.doFilter(MyFilter.java:82)
解决办法:第一种办法:此时,需要将 libsigar-amd64-linux.so、libsigar-x86-linux.so、sigar-amd64-winnt.dll、sigar-x86-winnt.dll、sigar-x86-winnt.lib 文件放在项目的 lib 文件夹下第二种办法:将上面的 5 个文件放在 linux 下的 /usr/lib 和 /usr/lib64 下(都要进行拷贝) -----使用场景是 linux 下启动 springboot 的 jar 包 以命令: java -jar xx.jar 运行才会这么做
补充:至于有的水友说的放在 tomcat 目录或者其他目录,因为我没碰到,需要你们自己测试
还有的朋友说放在 java.library.path 库下面,我感觉我的/usr/lib 或/usr/lib64 应该就是这个,具体是不是我不清楚(另外,查看 linux 下的 java.library.path 可新建 springboot 项目,在 Application 下新建一行打印输出,并打包在 linux 下以命令 java -jar xx.jar 运行即可显示,帖图如下)
 
  
 三、需要的文件可在我的博客资源下免费下载

刘大猫
还未添加个人签名 2022-08-23 加入
还未添加个人简介







 
    
评论