本文共 10652 字,大约阅读时间需要 35 分钟。
随着信息技术的快速发展,服务器资源的监控和管理显得尤为重要。在实际项目开发中,获取Linux系统中的CPU使用率、内存使用率以及磁盘使用率是一项常见需求。本文将详细介绍如何通过Java程序实现对这些关键资源的监控,并展示监控结果。
本文将从以下几个方面展开讨论:
通过这些步骤,我们可以构建一个完整的Linux系统资源监控工具。
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/