You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
314 lines
12 KiB
Java
314 lines
12 KiB
Java
2 years ago
|
package com.docus.server;
|
||
|
|
||
|
import com.alibaba.fastjson.JSONArray;
|
||
|
import com.alibaba.fastjson.JSONObject;
|
||
|
import oshi.SystemInfo;
|
||
|
import oshi.hardware.CentralProcessor;
|
||
|
import oshi.hardware.GlobalMemory;
|
||
|
import oshi.hardware.HardwareAbstractionLayer;
|
||
|
import oshi.hardware.NetworkIF;
|
||
|
import oshi.software.os.FileSystem;
|
||
|
import oshi.software.os.OSFileStore;
|
||
|
import oshi.software.os.OperatingSystem;
|
||
|
import oshi.util.Util;
|
||
|
|
||
|
import java.io.BufferedReader;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStreamReader;
|
||
|
import java.net.InetAddress;
|
||
|
import java.net.UnknownHostException;
|
||
|
import java.text.DecimalFormat;
|
||
|
import java.util.Formatter;
|
||
|
import java.util.HashMap;
|
||
|
import java.util.List;
|
||
|
import java.util.Map;
|
||
|
import java.util.Optional;
|
||
|
import java.util.Properties;
|
||
|
import java.util.StringTokenizer;
|
||
|
|
||
|
/**
|
||
|
* 系统消息工具类
|
||
|
**/
|
||
|
public class SystemInfoUtils {
|
||
|
|
||
|
private static final int OSHI_WAIT_SECOND = 1000;
|
||
|
private static final int SLEEP_TIME = 2 * 1000;
|
||
|
private static SystemInfo systemInfo = new SystemInfo();
|
||
|
private static HardwareAbstractionLayer hardware = systemInfo.getHardware();
|
||
|
private static OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
|
||
|
|
||
|
public static void main(String[] args) throws Exception {
|
||
|
JSONObject info = getInfo();
|
||
|
System.out.println(info);
|
||
|
}
|
||
|
|
||
|
public static JSONObject getCpuInfo() {
|
||
|
JSONObject cpuInfo = new JSONObject();
|
||
|
CentralProcessor processor = hardware.getProcessor();
|
||
|
// CPU信息
|
||
|
long[] prevTicks = processor.getSystemCpuLoadTicks();
|
||
|
Util.sleep(OSHI_WAIT_SECOND);
|
||
|
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;
|
||
|
//cpu核数
|
||
|
cpuInfo.put("cpuNum", processor.getLogicalProcessorCount());
|
||
|
//cpu系统使用率
|
||
|
cpuInfo.put("cSys", new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
|
||
|
//cpu用户使用率
|
||
|
cpuInfo.put("user", new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
|
||
|
//cpu当前等待率
|
||
|
cpuInfo.put("iowait", new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu));
|
||
|
//cpu当前使用率
|
||
|
cpuInfo.put("idle", new DecimalFormat("#.##%").format(1.0 - (idle * 1.0 / totalCpu)));
|
||
|
return cpuInfo;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 系统jvm信息
|
||
|
*/
|
||
|
public static JSONObject getJvmInfo() {
|
||
|
JSONObject cpuInfo = new JSONObject();
|
||
|
Properties props = System.getProperties();
|
||
|
Runtime runtime = Runtime.getRuntime();
|
||
|
long jvmTotalMemoryByte = runtime.totalMemory();
|
||
|
long freeMemoryByte = runtime.freeMemory();
|
||
|
//jvm总内存
|
||
|
cpuInfo.put("total", formatByte(runtime.totalMemory()));
|
||
|
//空闲空间
|
||
|
cpuInfo.put("free", formatByte(runtime.freeMemory()));
|
||
|
//jvm最大可申请
|
||
|
cpuInfo.put("max", formatByte(runtime.maxMemory()));
|
||
|
//vm已使用内存
|
||
|
cpuInfo.put("user", formatByte(jvmTotalMemoryByte - freeMemoryByte));
|
||
|
//jvm内存使用率
|
||
|
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte));
|
||
|
//jdk版本
|
||
|
cpuInfo.put("jdkVersion", props.getProperty("java.version"));
|
||
|
//jdk路径
|
||
|
cpuInfo.put("jdkHome", props.getProperty("java.home"));
|
||
|
return cpuInfo;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 系统内存信息
|
||
|
*/
|
||
|
public static JSONObject getMemInfo() {
|
||
|
JSONObject cpuInfo = new JSONObject();
|
||
|
GlobalMemory memory = systemInfo.getHardware().getMemory();
|
||
|
//总内存
|
||
|
long totalByte = memory.getTotal();
|
||
|
//剩余
|
||
|
long acaliableByte = memory.getAvailable();
|
||
|
//总内存
|
||
|
cpuInfo.put("total", formatByte(totalByte));
|
||
|
//使用
|
||
|
cpuInfo.put("used", formatByte(totalByte - acaliableByte));
|
||
|
//剩余内存
|
||
|
cpuInfo.put("free", formatByte(acaliableByte));
|
||
|
//使用率
|
||
|
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((totalByte - acaliableByte) * 1.0 / totalByte));
|
||
|
return cpuInfo;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 带宽
|
||
|
*/
|
||
|
public static JSONArray networkIFs() throws Exception {
|
||
|
JSONObject cpuInfo;
|
||
|
JSONArray sysFiles = new JSONArray();
|
||
|
|
||
|
List<NetworkIF> networkIFs = systemInfo.getHardware().getNetworkIFs();
|
||
|
for (NetworkIF networkIF : networkIFs) {
|
||
|
String name = networkIF.getName();
|
||
|
long receiveBytes = networkIF.getBytesRecv();
|
||
|
long transmitBytes = networkIF.getBytesSent();
|
||
|
|
||
|
cpuInfo = new JSONObject();
|
||
|
//名称
|
||
|
cpuInfo.put("name", name);
|
||
|
//网络接收
|
||
|
cpuInfo.put("receiveBytes", formatNumber(receiveBytes / (1024.0 * (2 * 1000 / 1000))));
|
||
|
//网络发送
|
||
|
cpuInfo.put("transmitBytes", formatNumber(transmitBytes / (1024.0 * (2 * 1000 / 1000))));
|
||
|
|
||
|
sysFiles.add(cpuInfo);
|
||
|
}
|
||
|
return sysFiles;
|
||
|
}
|
||
|
|
||
|
public static JSONObject getNetWork() {
|
||
|
JSONObject networkInfo = new JSONObject();
|
||
|
Properties props = System.getProperties();
|
||
|
String os = props.getProperty("os.name").toLowerCase();
|
||
|
os = os.startsWith("win") ? "windows" : "linux";
|
||
|
Map<String, String> result = new HashMap<>();
|
||
|
Process pro = null;
|
||
|
Runtime r = Runtime.getRuntime();
|
||
|
BufferedReader input = null;
|
||
|
try {
|
||
|
String command = "windows".equals(os) ? "netstat -e" : "ifconfig";
|
||
|
pro = r.exec(command);
|
||
|
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
|
||
|
long result1[] = readInLine(input, os);
|
||
|
Thread.sleep(SLEEP_TIME);
|
||
|
pro.destroy();
|
||
|
input.close();
|
||
|
pro = r.exec(command);
|
||
|
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
|
||
|
long result2[] = readInLine(input, os);
|
||
|
String rxPercent = formatNumber((result2[0] - result1[0]) / (1024.0 * (SLEEP_TIME / 1000)));// 下行速率(kB/s)
|
||
|
String txPercent = formatNumber((result2[1] - result1[1]) / (1024.0 * (SLEEP_TIME / 1000)));// 上行速率(kB/s)
|
||
|
networkInfo.put("rxPercent", rxPercent);
|
||
|
networkInfo.put("txPercent", txPercent);
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
} finally {
|
||
|
if (input != null) {
|
||
|
try {
|
||
|
input.close();
|
||
|
} catch (IOException e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
Optional.ofNullable(pro).ifPresent(p -> p.destroy());
|
||
|
}
|
||
|
return networkInfo;
|
||
|
}
|
||
|
|
||
|
private static long[] readInLine(BufferedReader input, String osType) {
|
||
|
long arr[] = new long[2];
|
||
|
StringTokenizer tokenStat = null;
|
||
|
try {
|
||
|
if (osType.equals("linux")) { // 获取linux环境下的网口上下行速率
|
||
|
long rx = 0, tx = 0;
|
||
|
String line = null;
|
||
|
//RX packets:4171603 errors:0 dropped:0 overruns:0 frame:0
|
||
|
//TX packets:4171603 errors:0 dropped:0 overruns:0 carrier:0
|
||
|
while ((line = input.readLine()) != null) {
|
||
|
if (line.indexOf("RX packets") >= 0) {
|
||
|
rx += Long.parseLong(line.substring(line.indexOf("RX packets") + 11, line.indexOf(" ", line.indexOf("RX packets") + 11)));
|
||
|
} else if (line.indexOf("TX packets") >= 0) {
|
||
|
tx += Long.parseLong(line.substring(line.indexOf("TX packets") + 11, line.indexOf(" ", line.indexOf("TX packets") + 11)));
|
||
|
}
|
||
|
}
|
||
|
arr[0] = rx;
|
||
|
arr[1] = tx;
|
||
|
} else { // 获取windows环境下的网口上下行速率
|
||
|
input.readLine();
|
||
|
input.readLine();
|
||
|
input.readLine();
|
||
|
input.readLine();
|
||
|
tokenStat = new StringTokenizer(input.readLine());
|
||
|
tokenStat.nextToken();
|
||
|
arr[0] = Long.parseLong(tokenStat.nextToken());
|
||
|
arr[1] = Long.parseLong(tokenStat.nextToken());
|
||
|
}
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
return arr;
|
||
|
}
|
||
|
|
||
|
|
||
|
private static String formatNumber(double f) {
|
||
|
return new Formatter().format("%.2f", f).toString();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 系统盘符信息
|
||
|
*/
|
||
|
public static JSONArray getSysFileInfo() {
|
||
|
JSONObject cpuInfo;
|
||
|
JSONArray sysFiles = new JSONArray();
|
||
|
FileSystem fileSystem = operatingSystem.getFileSystem();
|
||
|
List<OSFileStore> fsArray = fileSystem.getFileStores();
|
||
|
for (OSFileStore fs : fsArray) {
|
||
|
cpuInfo = new JSONObject();
|
||
|
//盘符路径
|
||
|
cpuInfo.put("dirName", fs.getMount());
|
||
|
//盘符类型
|
||
|
cpuInfo.put("sysTypeName", fs.getType());
|
||
|
//文件类型
|
||
|
cpuInfo.put("typeName", fs.getName());
|
||
|
//总大小
|
||
|
cpuInfo.put("total", formatByte(fs.getTotalSpace()));
|
||
|
//剩余大小
|
||
|
cpuInfo.put("free", formatByte(fs.getUsableSpace()));
|
||
|
//已经使用量
|
||
|
cpuInfo.put("used", formatByte(fs.getTotalSpace() - fs.getUsableSpace()));
|
||
|
if (fs.getTotalSpace() == 0) {
|
||
|
//资源的使用率
|
||
|
cpuInfo.put("usage", 0);
|
||
|
} else {
|
||
|
cpuInfo.put("usage", new DecimalFormat("#.##%").format((fs.getTotalSpace() - fs.getUsableSpace()) * 1.0 / fs.getTotalSpace()));
|
||
|
}
|
||
|
sysFiles.add(cpuInfo);
|
||
|
}
|
||
|
return sysFiles;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 系统信息
|
||
|
*/
|
||
|
public static JSONObject getSysInfo() throws UnknownHostException {
|
||
|
JSONObject cpuInfo = new JSONObject();
|
||
|
Properties props = System.getProperties();
|
||
|
//操作系统名
|
||
|
cpuInfo.put("osName", props.getProperty("os.name"));
|
||
|
//系统架构
|
||
|
cpuInfo.put("osArch", props.getProperty("os.arch"));
|
||
|
//服务器名称
|
||
|
cpuInfo.put("computerName", InetAddress.getLocalHost().getHostName());
|
||
|
//服务器Ip
|
||
|
cpuInfo.put("computerIp", InetAddress.getLocalHost().getHostAddress());
|
||
|
//项目路径
|
||
|
cpuInfo.put("userDir", props.getProperty("user.dir"));
|
||
|
return cpuInfo;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 所有系统信息
|
||
|
*/
|
||
|
public static JSONObject getInfo() throws Exception {
|
||
|
JSONObject info = new JSONObject();
|
||
|
info.put("cpuInfo", getCpuInfo());
|
||
|
info.put("jvmInfo", getJvmInfo());
|
||
|
info.put("memInfo", getMemInfo());
|
||
|
info.put("sysInfo", getSysInfo());
|
||
|
info.put("sysFileInfo", getSysFileInfo());
|
||
|
info.put("networkInfo", getNetWork());
|
||
|
return info;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 单位转换
|
||
|
*/
|
||
|
private static String formatByte(long byteNumber) {
|
||
|
//换算单位
|
||
|
double FORMAT = 1024.0;
|
||
|
double kbNumber = byteNumber / FORMAT;
|
||
|
if (kbNumber < FORMAT) {
|
||
|
return new DecimalFormat("#.##KB").format(kbNumber);
|
||
|
}
|
||
|
double mbNumber = kbNumber / FORMAT;
|
||
|
if (mbNumber < FORMAT) {
|
||
|
return new DecimalFormat("#.##MB").format(mbNumber);
|
||
|
}
|
||
|
double gbNumber = mbNumber / FORMAT;
|
||
|
if (gbNumber < FORMAT) {
|
||
|
return new DecimalFormat("#.##GB").format(gbNumber);
|
||
|
}
|
||
|
double tbNumber = gbNumber / FORMAT;
|
||
|
return new DecimalFormat("#.##TB").format(tbNumber);
|
||
|
}
|
||
|
}
|