diff --git a/engine-api/pom.xml b/engine-api/pom.xml index 59c3d1337..53d3dd57f 100644 --- a/engine-api/pom.xml +++ b/engine-api/pom.xml @@ -112,6 +112,11 @@ 4.1.45.Final + + com.github.oshi + oshi-core + + org.apache.maven.plugins maven-shade-plugin diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/CpuInfo.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/CpuInfo.java index 342987287..8b624b0c8 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/CpuInfo.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/CpuInfo.java @@ -17,8 +17,11 @@ package io.nosqlbench.engine.api.activityimpl; +import oshi.SystemInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import oshi.hardware.CentralProcessor; +import oshi.hardware.HardwareAbstractionLayer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -28,88 +31,54 @@ import java.util.*; public class CpuInfo { private final static Logger logger = LoggerFactory.getLogger(CpuInfo.class); - public static Optional getProcDetails() { - List> cpuinfo = new ArrayList<>(); - try { - String data = Files.readString(Path.of("/proc/cpuinfo"), StandardCharsets.UTF_8); - String[] sections = data.split("\n\n"); - for (String section : sections) { - Map cpuMap = new HashMap<>(); - cpuinfo.add(cpuMap); + final private static SystemInfo SYSTEM_INFO = new SystemInfo(); - String[] props = section.split("\n"); - for (String prop : props) { - String[] assignment = prop.split("\\s*:\\s*"); - if (assignment.length == 2) { - String property = assignment[0].trim(); - String value = assignment[1].trim(); - cpuMap.put(property, value); - } else { - cpuMap.put(assignment[0], ""); - } - } - } - } catch (Exception e) { - logger.warn("Unable to learn about CPU architecture: " + e.getMessage()); - return Optional.empty(); - } - return Optional.of(new ProcDetails(cpuinfo)); + public static Optional getProcDetails() { + return Optional.of(new ProcDetails(SYSTEM_INFO)); } - public static class ProcDetails { - private final List> details; + SystemInfo si; + HardwareAbstractionLayer hal; + CentralProcessor processor; - public ProcDetails(List> details) { - this.details = details; + public ProcDetails(SystemInfo si) { + this.si = si; + this.hal = si.getHardware(); + this.processor = hal.getProcessor(); } public int getCoreCount() { - return (int) details.stream() - .map(m -> m.get("core id")) - .distinct() - .count(); + return processor.getLogicalProcessorCount(); } public int getCpuCount() { - return (int) details.stream() - .map(m -> m.get("processor")) - .distinct() - .count(); + return processor.getPhysicalProcessorCount(); } public String getModelName() { - return details.stream() - .map(m -> m.get("model name")).findFirst().orElseThrow(); + return processor.getProcessorIdentifier().toString(); } public String getMhz() { - return details.stream() - .map(m -> m.get("cpu MHz")).findFirst().orElseThrow(); - } - - public String getCacheInfo() { - return details.stream() - .map(m -> m.get("cache size")).findFirst().orElseThrow(); + // or use processor.getCurrentFreq, and average, or min? + return Long.toString(processor.getMaxFreq()/ (1024*1024)); } public String toString() { return "cores=" + getCoreCount() + " cpus=" + getCpuCount() + " mhz=" + getMhz() + " speedavg=" + getCurrentSpeed().getAverage() + - " cache=" + getCacheInfo() + " model='" + getModelName() + "'"; + " model='" + getModelName() + "'"; } public double getMaxFreq(int cpu) { - return readFile("/sys/devices/system/cpu/cpu" + cpu + "/cpufreq/cpuinfo_max_freq",Double.NaN); + return (double)processor.getMaxFreq(); } public double getCurFreq(int cpu) { - return readFile("/sys/devices/system/cpu/cpu" + cpu + "/cpufreq/cpuinfo_max_freq",Double.NaN); - } - public double getMinFreq(int cpu) { - return readFile("/sys/devices/system/cpu/cpu" + cpu + "/cpufreq/cpuinfo_min_freq",Double.NaN); + return (double)processor.getCurrentFreq()[cpu]; } public double getCurrentSpeed(int cpu) { @@ -132,14 +101,5 @@ public class CpuInfo { return dss; } - private double readFile(String path, double defaultValue) { - try { - Path readPath = Path.of(path); - String content = Files.readString(readPath); - return Double.parseDouble(content); - } catch (Exception e) { - return defaultValue; - } - } } } diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityimpl/CpuInfoTest.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityimpl/CpuInfoTest.java index 47ca71cfb..7c3667f3e 100644 --- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityimpl/CpuInfoTest.java +++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityimpl/CpuInfoTest.java @@ -17,7 +17,7 @@ package io.nosqlbench.engine.api.activityimpl; -import org.junit.Test; +import org.testng.annotations.Test; import java.util.Optional; diff --git a/engine-cli/src/test/java/io/nosqlbench/engine/cli/NBCLIScriptAssemblyTest.java b/engine-cli/src/test/java/io/nosqlbench/engine/cli/NBCLIScriptAssemblyTest.java index 035deea30..df9807cb9 100644 --- a/engine-cli/src/test/java/io/nosqlbench/engine/cli/NBCLIScriptAssemblyTest.java +++ b/engine-cli/src/test/java/io/nosqlbench/engine/cli/NBCLIScriptAssemblyTest.java @@ -20,7 +20,7 @@ package io.nosqlbench.engine.cli; import io.nosqlbench.engine.cli.EBCLIOptions; import io.nosqlbench.engine.cli.EBCLIScriptAssembly; -import org.junit.Test; +import org.testng.annotations.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/mvn-defaults/pom.xml b/mvn-defaults/pom.xml index c58ffb21d..008ebf541 100644 --- a/mvn-defaults/pom.xml +++ b/mvn-defaults/pom.xml @@ -65,8 +65,14 @@ log4j-core 2.13.0 - + + com.github.oshi + oshi-core + 4.5.0 + + +