博客
关于我
Java获取Liunx服务器的cpu使用率、内存使用率以及磁盘使用率
阅读量:796 次
发布时间:2023-03-28

本文共 10652 字,大约阅读时间需要 35 分钟。

Linux系统资源监控工具开发实践

系统监控工具开发实践

随着信息技术的快速发展,服务器资源的监控和管理显得尤为重要。在实际项目开发中,获取Linux系统中的CPU使用率、内存使用率以及磁盘使用率是一项常见需求。本文将详细介绍如何通过Java程序实现对这些关键资源的监控,并展示监控结果。

实现概述

本文将从以下几个方面展开讨论:

  • 创建CPU、内存和磁盘相关信息的实体类
  • 开发一个初始化服务器相关信息类
  • 创建一个展示监控信息的页面类
  • 编写控制器和服务实现类
  • 通过这些步骤,我们可以构建一个完整的Linux系统资源监控工具。

    实体类设计

    CPU信息实体类

    package com.gdhengdian.monitorservice.domain.server;import org.springframework.stereotype.Component;import java.io.Serializable;@Componentpublic class Cpu implements Serializable {    private int cpuNum;    private String total;    private String sys;    private String used;    private String wait;    private String free;    public Cpu() {    }    public int getCpuNum() {        return cpuNum;    }    public void setCpuNum(int cpuNum) {        this.cpuNum = cpuNum;    }    public String getTotal() {        return total;    }    public void setTotal(String total) {        this.total = total;    }    public String getSys() {        return sys;    }    public void setSys(String sys) {        this.sys = sys;    }    public String getUsed() {        return used;    }    public void setUsed(String used) {        this.used = used;    }    public String getWait() {        return wait;    }    public void setWait(String wait) {        this.wait = wait;    }    public String getFree() {        return free;    }    public void setFree(String free) {        this.free = free;    }}

    内存信息实体类

    package com.gdhengdian.monitorservice.domain.server;import org.springframework.stereotype.Component;import java.io.Serializable;@Componentpublic class Mem implements Serializable {    private String usedRate;    private long total;    private long used;    private long free;    public Mem() {    }    public double getTotal() {        return (total / (1024 * 1024 * 1024)) * 100;    }    public void setTotal(long total) {        this.total = total;    }    public double getUsed() {        return (used / (1024 * 1024 * 1024)) * 100;    }    public void setUsed(long used) {        this.used = used;    }    public double getFree() {        return (free / (1024 * 1024 * 1024)) * 100;    }    public void setFree(long free) {        this.free = free;    }    public String getUsedRate() {        return usedRate;    }    public void setUsedRate(String usedRate) {        this.usedRate = usedRate;    }}

    磁盘信息实体类

    package com.gdhengdian.monitorservice.domain.server;import org.springframework.stereotype.Component;import java.io.Serializable;@Componentpublic class SysFile implements Serializable {    private String dirName;    private String sysTypeName;    private String typeName;    private String total;    private String free;    private String used;    private String usage;    public SysFile() {    }    public String getDirName() {        return dirName;    }    public void setDirName(String dirName) {        this.dirName = dirName;    }    public String getSysTypeName() {        return sysTypeName;    }    public void setSysTypeName(String sysTypeName) {        this.sysTypeName = sysTypeName;    }    public String getTypeName() {        return typeName;    }    public void setTypeName(String typeName) {        this.typeName = typeName;    }    public String getTotal() {        return total;    }    public void setTotal(String total) {        this.total = total;    }    public String getFree() {        return free;    }    public void setFree(String free) {        this.free = free;    }    public String getUsed() {        return used;    }    public void setUsed(String used) {        this.used = used;    }    public String getUsage() {        return usage;    }    public void setUsage(String usage) {        this.usage = usage;    }}

    服务器信息初始化类

    package com.gdhengdian.monitorservice.domain;import com.gdhengdian.monitorservice.domain.server.Arith;import com.gdhengdian.monitorservice.domain.server.Cpu;import com.gdhengdian.monitorservice.domain.server.Mem;import com.gdhengdian.monitorservice.domain.server.SysFile;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import oshi.SystemInfo;import oshi.hardware.CentralProcessor;import oshi.hardware.GlobalMemory;import oshi.hardware.HardwareAbstractionLayer;import oshi.software.os.FileSystem;import oshi.software.os.OSFileStore;import oshi.software.os.OperatingSystem;import oshi.util.Util;import java.text.NumberFormat;@Componentpublic class Server {    private static final int OSHI_WAIT_SECOND = 2000;    @Autowired    private Cpu cpu;    @Autowired    private Mem mem;    @Autowired    private SysFile sysFiles;    public void copyTo() throws Exception {        SystemInfo si = new SystemInfo();        HardwareAbstractionLayer hal = si.getHardware();        setCpuInfo(hal.getProcessor());        setMemInfo(hal.getMemory());        setSysFiles(si.getOperatingSystem());    }    private void setCpuInfo(CentralProcessor processor) {        Util.sleep(OSHI_WAIT_SECOND);        NumberFormat numberFormat = NumberFormat.getInstance();        numberFormat.setMaximumFractionDigits(2);        long[] prevTicks = processor.getSystemCpuLoadTicks();        long[] ticks = processor.getSystemCpuLoadTicks();        Long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];        Long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];        Long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];        Long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];        Long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];        Long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];        Long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];        Long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];        Long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;        Long cpuUsed = cSys + user;        double usedRate = cpuUsed.doubleValue() / totalCpu.doubleValue();        numberFormat.format(usedRate * 100);        cpu.setCpuNum(processor.getLogicalProcessorCount());        cpu.setTotal(String.format("%.2f", usedRate * 100));    }    private void setMemInfo(GlobalMemory memory) {        NumberFormat numberFormat = NumberFormat.getInstance();        numberFormat.setMaximumFractionDigits(2);        long totalMem = memory.getTotal();        mem.setTotal(totalMem);        mem.setUsed(memory.getTotal() - memory.getAvailable());        mem.setFree(memory.getAvailable());        String usedRate = String.format("%.2f", (mem.getUsed() / mem.getTotal()) * 100);        mem.setUsedRate(usedRate);    }    private void setSysFiles(OperatingSystem os) {        FileSystem fileSystem = os.getFileSystem();        OSFileStore[] fsArray = fileSystem.getFileStores();        long total = 0;        long used = 0;        long free = 0;        for (OSFileStore fs : fsArray) {            free += fs.getUsableSpace();            total += fs.getTotalSpace();        }        used = total - free;        double rate = (used / total) * 100;        sysFiles.setUsage(String.format("%.2f", rate));    }}

    展示页面类

    package com.gdhengdian.monitorservice.domain;import org.springframework.stereotype.Component;import java.io.Serializable;@Componentpublic class SystemResourceInfo implements Serializable {    private String cpuInfo;    private String ramInfo;    private String fileInfo;    public String getCpuInfo() {        return cpuInfo;    }    public void setCpuInfo(String cpuInfo) {        this.cpuInfo = cpuInfo;    }    public String getRamInfo() {        return ramInfo;    }    public void setRamInfo(String ramInfo) {        this.ramInfo = ramInfo;    }    public String getFileInfo() {        return fileInfo;    }    public void setFileInfo(String fileInfo) {        this.fileInfo = fileInfo;    }    @Override    public String toString() {        return getCpuInfo() + "----" + getRamInfo() + "----" + getFileInfo();    }}

    控制器代码

    package com.gdhengdian.monitorservice.controller;import com.gdhengdian.monitorservice.common.HttpRespond;import com.gdhengdian.monitorservice.domain.SystemResourceInfo;import com.gdhengdian.monitorservice.service.ServerService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/api/v1/monitor")public class MonitorController {    @Autowired    private ServerService serverService;    @GetMapping("/system/info")    public HttpRespond
    getSystemInfo() { HttpRespond
    respond = serverService.getSystemInfo(); return respond; }}

    服务实现类

    package com.gdhengdian.monitorservice.service.impl;import com.gdhengdian.monitorservice.common.HttpRespond;import com.gdhengdian.monitorservice.domain.Server;import com.gdhengdian.monitorservice.domain.SystemResourceInfo;import com.gdhengdian.monitorservice.service.ServerService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.stereotype.Service;@Servicepublic class ServerServiceImpl implements ServerService {    @Autowired    private RedisTemplate
    redisTemplate; @Autowired private Server server; @Autowired private SystemResourceInfo systemResourceInfo; @Override public HttpRespond
    getSystemInfo() { try { server.copyTo(); systemResourceInfo.setCpuInfo(server.getCpu().getTotal()); systemResourceInfo.setRamInfo(server.getMem().getUsedRate()); systemResourceInfo.setFileInfo(server.getSysFiles().getUsage()); } catch (Exception e) { e.printStackTrace(); } infoIntoRedis(systemResourceInfo); return HttpRespond.success(systemResourceInfo); } private void infoIntoRedis(SystemResourceInfo systemResourceInfo) { ValueOperations valueOperations = this.redisTemplate.opsForValue(); valueOperations.set("systemsource", systemResourceInfo); }}

    总结

    通过以上代码实现,我们可以构建一个完整的Linux系统资源监控工具。该工具能够实时监控CPU、内存和磁盘的使用情况,并以用户友好的界面展示监控结果。该解决方案利用了Spring Boot框架和Oshi库,对系统资源进行了全面而细致的监控和管理。

    转载地址:http://sdhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现字符串boyer moore search博耶摩尔搜索算法(附完整源码)
    查看>>
    Objective-C实现字符串IP地址转DWORD地址(附完整源码)
    查看>>
    Objective-C实现字符串jaro winkler算法(附完整源码)
    查看>>
    Objective-C实现字符串manacher马拉车算法(附完整源码)
    查看>>
    Objective-C实现字符串wildcard pattern matching通配符模式匹配算法(附完整源码)
    查看>>
    Objective-C实现字符串word patterns单词模式算法(附完整源码)
    查看>>
    Objective-C实现字符串Z 函数或 Z 算法(附完整源码)
    查看>>
    Objective-C实现字符串加解密(附完整源码)
    查看>>
    Objective-C实现字符串复制功能(附完整源码)
    查看>>
    Objective-C实现字符串是否回文Palindrome算法 (附完整源码)
    查看>>
    Objective-C实现字符串查找子串(附完整源码)
    查看>>
    Objective-C实现完整的ComplexNumber复数类(附完整源码)
    查看>>
    Objective-C实现实现rabin karp算法(附完整源码)
    查看>>
    Objective-C实现对图像进行色调处理算法(附完整源码)
    查看>>
    Objective-C实现对称矩阵压缩存储(附完整源码)
    查看>>
    Objective-C实现寻找欧拉路径/回路(附完整源码)
    查看>>
    Objective-C实现导弹跟踪算法(附完整源码)
    查看>>
    Objective-C实现将 base64 字符串转换为字节数组算法(附完整源码)
    查看>>
    Objective-C实现将位转换为浮点数bitsToFloat算法(附完整源码)
    查看>>
    Objective-C实现将列表向右旋转 k 个位置算法(附完整源码)
    查看>>