From 0ceff7f5b4cfdd2b2f26591d933eb112d8cf2329 Mon Sep 17 00:00:00 2001 From: Bart Meyers Date: Fri, 27 Sep 2024 13:59:21 +0200 Subject: [PATCH] Add cpu speed detection methods Added additional match for lscpu Added additional file to check --- .../cloudstack/utils/linux/KVMHostInfo.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java index c0b416410cbc..cee074213142 100644 --- a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java +++ b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java @@ -58,9 +58,8 @@ public class KVMHostInfo { private long reservedMemory; private long overCommitMemory; private List capabilities = new ArrayList<>(); - - private static String cpuInfoFreqFileName = "/sys/devices/system/cpu/cpu0/cpufreq/base_frequency"; private static String cpuArchCommand = "/usr/bin/arch"; + private static List cpuInfoFreqFileNames = List.of("/sys/devices/system/cpu/cpu0/cpufreq/base_frequency","/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"); public KVMHostInfo(long reservedMemory, long overCommitMemory, long manualSpeed, int reservedCpus) { this.cpuSpeed = manualSpeed; @@ -134,29 +133,41 @@ protected static long getCpuSpeed(final String cpabilities, final NodeInfo nodeI } private static long getCpuSpeedFromCommandLscpu() { + long speed = 0L; + LOGGER.info("Fetching CPU speed from command \"lscpu\"."); try { - LOGGER.info("Fetching CPU speed from command \"lscpu\"."); String command = "lscpu | grep -i 'Model name' | head -n 1 | egrep -o '[[:digit:]].[[:digit:]]+GHz' | sed 's/GHz//g'"; String result = Script.runSimpleBashScript(command); - long speed = (long) (Float.parseFloat(result) * 1000); + speed = (long) (Float.parseFloat(result) * 1000); LOGGER.info(String.format("Command [%s] resulted in the value [%s] for CPU speed.", command, speed)); return speed; } catch (NullPointerException | NumberFormatException e) { LOGGER.error(String.format("Unable to retrieve the CPU speed from lscpu."), e); - return 0L; } + try { + String command = "lscpu | grep -i 'CPU max MHz' | head -n 1 | sed 's/^.*: //' | xargs"; + String result = Script.runSimpleBashScript(command); + speed = (long) (Float.parseFloat(result)); + LOGGER.info(String.format("Command [%s] resulted in the value [%s] for CPU speed.", command, speed)); + return speed; + } catch (NullPointerException | NumberFormatException e) { + LOGGER.error(String.format("Unable to retrieve the CPU speed from lscpu."), e); + } + return speed; } private static long getCpuSpeedFromFile() { - LOGGER.info(String.format("Fetching CPU speed from file [%s].", cpuInfoFreqFileName)); - try (Reader reader = new FileReader(cpuInfoFreqFileName)) { - Long cpuInfoFreq = Long.parseLong(IOUtils.toString(reader).trim()); - LOGGER.info(String.format("Retrieved value [%s] from file [%s]. This corresponds to a CPU speed of [%s] MHz.", cpuInfoFreq, cpuInfoFreqFileName, cpuInfoFreq / 1000)); - return cpuInfoFreq / 1000; - } catch (IOException | NumberFormatException e) { - LOGGER.error(String.format("Unable to retrieve the CPU speed from file [%s]", cpuInfoFreqFileName), e); - return 0L; + for (final String cpuInfoFreqFileName: cpuInfoFreqFileNames) { + LOGGER.info(String.format("Fetching CPU speed from file [%s].", cpuInfoFreqFileName)); + try (Reader reader = new FileReader(cpuInfoFreqFileName)) { + Long cpuInfoFreq = Long.parseLong(IOUtils.toString(reader).trim()); + LOGGER.info(String.format("Retrieved value [%s] from file [%s]. This corresponds to a CPU speed of [%s] MHz.", cpuInfoFreq, cpuInfoFreqFileName, cpuInfoFreq / 1000)); + return cpuInfoFreq / 1000; + } catch (IOException | NumberFormatException e) { + LOGGER.error(String.format("Unable to retrieve the CPU speed from file [%s]", cpuInfoFreqFileName), e); + } } + return 0L; } protected static long getCpuSpeedFromHostCapabilities(final String capabilities) {