diff --git a/src/main/java/net/geedge/confagent/controller/OSHIController.java b/src/main/java/net/geedge/confagent/controller/OSHIController.java index f4f53e7..3db3a5d 100644 --- a/src/main/java/net/geedge/confagent/controller/OSHIController.java +++ b/src/main/java/net/geedge/confagent/controller/OSHIController.java @@ -22,7 +22,7 @@ public class OSHIController extends BaseController{ } @GetMapping("/oshi/process") - public R getProcessInfo(HttpServletRequest request){ + public R getProcessInfo(HttpServletRequest request) throws InterruptedException { List result = OSHIUtils.getProcessInfo(); diff --git a/src/main/java/net/geedge/confagent/util/OSHIUtils.java b/src/main/java/net/geedge/confagent/util/OSHIUtils.java index 0fdfcfc..39bd20c 100644 --- a/src/main/java/net/geedge/confagent/util/OSHIUtils.java +++ b/src/main/java/net/geedge/confagent/util/OSHIUtils.java @@ -10,6 +10,8 @@ import java.net.UnknownHostException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; @SuppressWarnings("all") public class OSHIUtils { @@ -134,13 +136,16 @@ public class OSHIUtils { * 进程信息 * @return result */ - public static List getProcessInfo(){ + public static List getProcessInfo() throws InterruptedException { List result = Tool.ListUtil.list(false); - List procs = operatingSystem.getProcesses(); + List oldProcess = operatingSystem.getProcesses(); + Thread.sleep(500); + List currentProcess = operatingSystem.getProcesses(); + Map cpuUsage = getCpuUsage(currentProcess, oldProcess); GlobalMemory memory = hal.getMemory(); - for (OSProcess proc : procs) { + for (OSProcess proc : currentProcess) { HashMap procsData = Tool.MapUtil.newHashMap(); procsData.put("name",proc.getName()); procsData.put("commandLine",proc.getCommandLine()); @@ -148,12 +153,7 @@ public class OSHIUtils { procsData.put("parentProcessID",proc.getParentProcessID()); procsData.put("startTime",proc.getStartTime()); procsData.put("priority",proc.getPriority()); - /** - * For per-Process CPU ticks, there is no "idle" counter available, so the calculation ends up being (active time / up time) - * This interpretation matches the value displayed in ps or top on Unix-based operating systems - * If you want per-Process CPU load to match the Windows Task Manager display, you should divide OSHI's calculation by the number of logical processors - */ - procsData.put("cpuUsage",Tool.NumberUtil.div(proc.getKernelTime() + proc.getUserTime(), proc.getUpTime()) * 100d); + procsData.put("cpuUsage",(double)cpuUsage.get(proc.getProcessID()) * 100d); procsData.put("memUsage",Tool.NumberUtil.div(proc.getResidentSetSize(), memory.getTotal()) * 100d); procsData.put("state",proc.getState().toString()); procsData.put("openFiles",proc.getOpenFiles()); @@ -169,6 +169,23 @@ public class OSHIUtils { return result; } + /** + * 获取进程cpu利用率 + * @param currentProc + * @param oldProcess + * @return + */ + private static Map getCpuUsage(List currentProc, List oldProcess) { + + Map procs = oldProcess.stream().collect(Collectors.toMap(OSProcess::getProcessID, Function.identity())); + HashMap map = Tool.MapUtil.newHashMap(); + for (OSProcess proc : currentProc) { + OSProcess old = procs.get(proc.getProcessID()); + map.put(proc.getProcessID(),proc.getProcessCpuLoadBetweenTicks(old)); + } + return map; + } + /** * 网络连接信息 * @return result