fix: NEZ-2142 nz-talon 修改进程cpu利用率计算

This commit is contained in:
zhangshuai
2022-08-29 11:21:47 +08:00
parent b47a61f605
commit 1b998e9100
2 changed files with 27 additions and 10 deletions

View File

@@ -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<Map> result = OSHIUtils.getProcessInfo();

View File

@@ -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<Map> getProcessInfo(){
public static List<Map> getProcessInfo() throws InterruptedException {
List<Map> result = Tool.ListUtil.list(false);
List<OSProcess> procs = operatingSystem.getProcesses();
List<OSProcess> oldProcess = operatingSystem.getProcesses();
Thread.sleep(500);
List<OSProcess> currentProcess = operatingSystem.getProcesses();
Map<Integer, Object> cpuUsage = getCpuUsage(currentProcess, oldProcess);
GlobalMemory memory = hal.getMemory();
for (OSProcess proc : procs) {
for (OSProcess proc : currentProcess) {
HashMap<String, Object> 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<Integer,Object> getCpuUsage(List<OSProcess> currentProc, List<OSProcess> oldProcess) {
Map<Integer, OSProcess> procs = oldProcess.stream().collect(Collectors.toMap(OSProcess::getProcessID, Function.identity()));
HashMap<Integer, Object> 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