一、环境说明
- 操作系统: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 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获取
- 查看libvirtd的日志(需要修改/etc/libvirt/libvirtd.conf开启日志,并配置日志级别),发现也报错:Failed to get host CPU cache info,通过查看代码是读取/sys/devices/system/cpu/cpu0/cache,而openEuler没有对应的文件。
- 通过查阅资料,发现可以通过命令行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;
}
}
- 解决