cloudstack平台host加入后,显示CPU speed为0GHz

一、环境说明

  • 操作系统:openEuler 22.03
  • CPU:Kunpeng-920,arm v8
  • cloudstack:4.18
  • libvirtd:6.2.0

二、问题描述

cloudstack平台初始化完成后,第一次加入host,系统虚拟机一直无法正常创建,查看cloudstack management的日志,一直显示资源不够,无法正常调度。
点击进入host详情页面,发现CPU speed为0 GHz(图片显示为正常状态)。
cloudstack平台host加入后,显示CPU speed为0GHz_第1张图片

三、排查过程

  1. 通过查看cloudstack agent的日志,发现agent获取cpu speed的方式有三种(关键字Fetching CPU speed)
    • 命令行,lscpu
    • 运行时文件:/sys/devices/system/cpu/cpu0/cpufreq/base_frequency,写死在./plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java
    • 通过libvirt获取
  2. 查看libvirtd的日志(需要修改/etc/libvirt/libvirtd.conf开启日志,并配置日志级别),发现也报错:Failed to get host CPU cache info,通过查看代码是读取/sys/devices/system/cpu/cpu0/cache,而openEuler没有对应的文件。
  3. 通过查阅资料,发现可以通过命令行dmidecode -t processor获取cpu speed,因此尝试修改cloudstack agent的代码
在plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/linux/KVMHostInfo.java中添加对应的函数
114行:
        speed = getCpuSpeedFromCommanddmidecode();
        if(speed > 0L) {
            return speed;
        }
138行:
    private static long getCpuSpeedFromCommanddmidecode() {
        try {
            LOGGER.info("Fetching CPU speed from command \"dmidecode -t processor\".");
            String command = "dmidecode -t processor | grep 'Current Speed' | head -n 1 | egrep -o '[[:digit:]]+ MHz' | awk '{print $1}'";
            String result = Script.runSimpleBashScript(command);
            long 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 0L;
        }
    } 
  1. 解决

你可能感兴趣的:(cloudstack,cloudstack)