写点什么

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 加入

还未添加个人简介

评论

发布
暂无评论
sigar获取机器部分负载信息方法及问题解决_人工智能_刘大猫_InfoQ写作社区