package arkref.ext.fig.basic; import java.io.*; import java.util.*; import java.net.*; public class SysInfoUtils { public static String getCurrentDateStr() { return new Date().toString(); } public static String getHostName() { try { return InetAddress.getLocalHost().getHostName(); } catch(UnknownHostException e) { return "(unknown)"; } } public static String getShortHostName() { String name = getHostName(); int i = name.indexOf('.'); if(i == -1) return name; return name.substring(0, i); } public static String getcwd() { return System.getProperty("user.dir"); } private static int numCPUs = -1; // Cache: doesn't change public static int getNumCPUs() { // Linux if(numCPUs != -1) return numCPUs; try { int n = 0; for(String line : IOUtils.readLines("/proc/cpuinfo")) { if(line.startsWith("processor")) n++; } return numCPUs = n; } catch(IOException e) { } // MacOS try { // Output format: hw.ncpu: 1 return numCPUs = Integer.parseInt(StrUtils.split(Utils.systemGetStringOutput("sysctl hw.ncpu").trim(), " ")[1]); } catch(Exception e) { } return 0; } public static int getNumUsedCPUs() { // This command should return the percent CPU usages of // all processes, one on each line // A bit of a hack: if a process uses more than 50% of the CPU, // then it is considered used try { int n = 0; for(String line : StrUtils.split(Utils.systemGetStringOutput("ps ax -o pcpu"), "\n")) { double percentCPU = Utils.parseDoubleEasy(line); if(percentCPU > 50) n++; if(percentCPU > 150) n++; if(percentCPU > 250) n++; if(percentCPU > 350) n++; } return n; } catch(Exception e) { return -1; } } public static int getNumFreeCPUs() { return getNumCPUs() - getNumUsedCPUs(); } // Return in MHz private static int cpuSpeed = -1; // Cache it since it doesn't change public static int getCPUSpeed() { if(cpuSpeed != -1) return cpuSpeed; // Linux: take the average of the CPU speeds of all processors try { double sum = 0; int n = 0; for(String line : IOUtils.readLines("/proc/cpuinfo")) { if(line.startsWith("cpu MHz")) { sum += Double.parseDouble(ListUtils.getLast(StrUtils.split(line))); n++; } } return cpuSpeed = (int)(sum/n+0.5); } catch(IOException e) { } // MacOS try { // Output format: hw.cpufrequency: 1499999994 return cpuSpeed = Integer.parseInt(StrUtils.split(Utils.systemGetStringOutput("sysctl hw.cpufrequency").trim(), " ")[1])/1000000; } catch(Exception e) { } return 0; } public static String getCPUSpeedStr() { return getCPUSpeed() + " MHz"; } // Memory of this java process public static String getMaxMemoryStr() { long mem = Runtime.getRuntime().maxMemory(); return Fmt.bytesToString(mem); } public static String getUsedMemoryStr() { long totalMem = Runtime.getRuntime().totalMemory(); long freeMem = Runtime.getRuntime().freeMemory(); return Fmt.bytesToString(totalMem-freeMem); } // Memory public static long getFreeMemory() { // Linux try { int n = 0; long memfree = 0, buffers = 0, cached = 0; for(String line : IOUtils.readLines("/proc/meminfo")) { if(line.startsWith("MemFree:")) memfree = Long.parseLong(line.split("\\s+")[1]); if(line.startsWith("Buffers:")) buffers = Long.parseLong(line.split("\\s+")[1]); if(line.startsWith("Cached:")) cached = Long.parseLong(line.split("\\s+")[1]); } return (memfree + buffers + cached) * 1024; } catch(Exception e) { return 0; } } }