引言
运维的同事常常遇到这么四个问题:
- Nova 如何统计 OpenStack 计算资源?
- 为什么 free_ram_mb, free_disk_gb 有时会是负数?
- 即使 free_ram_mb, free_disk_gb 为负,为什么虚拟机依旧能创建成功?
- 资源不足会导致虚拟机创建失败,但指定了 host 有时却能创建成功?
本文以以上四个问题为切入点,结合 Kilo 版本 Nova 源码,在默认 Hypervisor 为 Qemu-kvm 的前提下(不同 Hypervisor 的资源统计方式差别较大 ),揭开 OpenStack 统计资源和资源调度的面纱。
Nova 需统计哪些资源
云计算的本质在于将硬件资源软件化,以达到快速按需交付的效果,最基本的计算、存储和网络基础元素并没有因此改变。就计算而言,CPU、RAM 和 DISK等依旧是必不可少的核心资源。
从源码和数据库相关表可以得出,Nova 统计计算节点的四类计算资源:
- CPU: 包括 vcpus(节点物理 cpu 总线程数), vcpus_used(该节点虚拟机的 vcpu 总和)
- RAM: 包括 memory_mb(该节点总 ram),memory_mb_used(该节点虚拟机的 ram 总和),free_ram_mb(可用 ram)
Note: memory_mb = memory_mb_used + free_ram_mb - DISK:local_gb(该节点虚拟机的总可用 disk),local_gb_used(该节点虚拟机 disk 总和),free_disk_gb(可用 disk)
Note:local_gb = local_gb_used + free_disk_gb - 其它:PCI 设备、CPU 拓扑、NUMA 拓扑和 Hypervisor 等信息
本文重点关注 CPU、RAM 和 DISK 三类资源。
Nova 如何收集资源
从 源码 可以看出,Nova 每分钟统计一次资源,方式如下:
- CPU
- vcpus: libvirt 中 get_Info()
- vcpu_used: 通过 libvirt 中 dom.vcpus() 从而统计该节点上所有虚拟机 vcpu 总和
- RAM