Nova 如何统计 OpenStack 资源

1、云计算的本质在于将硬件资源软件化,以达到快速按需交付的效果,最基本的计算、存储和网络基础元素并没有因此改变。就计算而言,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 等信息

从代码可以看出,Nova 每分钟统计一次资源,方式如下:

  • CPU
    • vcpus: libvirt 中 get_Info()
    • vcpu_used: 通过 libvirt 中 dom.vcpus() 从而统计该节点上所有虚拟机 vcpu 总和
  • RAM
    • memory: libvirt 中 get_Info()
    • memory_mb_used:先通过 /proc/meminfo 统计可用内存, 再用总内存减去可用内存得出(资源再统计时会重新计算该值)
  • DISK
    • local_gb: os.statvfs(CONF.instances_path)
    • local_gb_used: os.statvfs(CONF.instances_path)(资源再统计时会重新计算该值)
  • 其它
    • hypervisor 相关信息:均通过 libvirt 获取
    • PCI: libvirt 中 listDevices(‘pci’, 0)
    • NUMA: livirt 中 getCapabilities()

那么问题来了,按照上述收集资源的方式,free_ram_mb, free_disk_gb 不可能为负数。Nova-compute 在上报资源至数据库前,还根据该节点上的虚拟机又做了一次资源统计。

为什么需再次统计 RAM 资源?宿主机的内存不只是分配给虚拟机,还有肩负其他应用,因此必须重新统计 RAM 资源。

统计的方式为:

free_memory = total_memory - CONF.reserved_host_memory_mb - 虚拟机理论内存总和
CONF.reserved_host_memory_mb:内存预留,比如预留给系统或其它应用
虚拟机理论内存总和:即所有虚拟机 flavor 中的内存总和 free_disk_gb = local_gb - CONF.reserved_host_disk_mb / 1024 - 虚拟机理论磁盘总和
nova.scheduler.filters.ram_filter.BaseRamFilter
class BaseRamFilter(filters.BaseHostFilter):

    def host_passes(self, host_state, spec_obj):
        """Only return hosts with sufficient available RAM."""
        requested_ram = spec_obj.memory_mb
        free_ram_mb = host_state.free_ram_mb
        total_usable_ram_mb = host_state.total_usable_ram_mb

        if not total_usable_ram_mb >= requested_ram:
            LOG.debug("%(host_state)s does not have %(requested_ram)s MB "
                      "usable ram before overcommit, it only has "
                      "%(usable_ram)s MB.",
                      {‘host_state‘: host_state,
                       ‘requested_ram‘: requested_ram,
                       ‘usable_ram‘: total_usable_ram_mb})
            return False

        ram_allocation_ratio = self._get_ram_allocation_ratio(host_state,
                                                              spec_obj)

        memory_mb_limit = total_usable_ram_mb * ram_allocation_ratio
        used_ram_mb = total_usable_ram_mb - free_ram_mb
        usable_ram = memory_mb_limit - used_ram_mb
        if not usable_ram >= requested_ram:
            LOG.debug("%(host_state)s does not have %(requested_ram)s MB "
                    "usable ram, it only has %(usable_ram)s MB usable ram.",
                    {‘host_state‘: host_state,
                     ‘requested_ram‘: requested_ram,
                     ‘usable_ram‘: usable_ram})
            return False

        host_state.limits[‘memory_mb‘] = memory_mb_limit
        return True

为什么要重新统计 DISK 资源?原因与 RAM 大致相同。为了节省空间, qemu-kvm 常用 QCOW2 格式镜像,以创建 DISK 大小为 100G 的虚拟机为例,虚拟机创建后,其镜像文件往往只有几百 KB,当有大量数据写入时磁盘时,宿主机上对应的虚拟机镜像文件会迅速增大。而 os.statvfs 统计的是虚拟机磁盘当前使用量,并不能反映潜在使用量。因此必须重新统计 DISK 资源。

统计的方式为:

free_disk_gb = local_gb - CONF.reserved_host_disk_mb / 1024 - 虚拟机理论磁盘总和

CONF.reserved_host_disk_mb:磁盘预留

虚拟机理论磁盘总和:即所有虚拟机  flavor 中得磁盘总和
nova.scheduler.filters.disk_filter.DiskFilter
class DiskFilter(filters.BaseHostFilter)::
    def _get_disk_allocation_ratio(self, host_state, spec_obj):
    return host_state.disk_allocation_ratio

def host_passes(self, host_state, spec_obj):
    """Filter based on disk usage."""
    requested_disk = (1024 * (spec_obj.root_gb +
                              spec_obj.ephemeral_gb) +
                      spec_obj.swap)

    free_disk_mb = host_state.free_disk_mb
    total_usable_disk_mb = host_state.total_usable_disk_gb * 1024

    if total_usable_disk_mb < requested_disk:
    LOG.debug("%(host_state)s does not have %(requested_disk)s "
              "MB usable disk space before overcommit, it only "
              "has %(physical_disk_size)s MB.",
              {‘host_state‘: host_state,
               ‘requested_disk‘: requested_disk,
               ‘physical_disk_size‘:
                   total_usable_disk_mb})
    return False
    disk_allocation_ratio = self._get_disk_allocation_ratio(
    host_state, spec_obj)

    disk_mb_limit = total_usable_disk_mb * disk_allocation_ratio
    used_disk_mb = total_usable_disk_mb - free_disk_mb
    usable_disk_mb = disk_mb_limit - used_disk_mb

    if not usable_disk_mb >= requested_disk:
    LOG.debug("%(host_state)s does not have %(requested_disk)s MB "
            "usable disk, it only has %(usable_disk_mb)s MB usable "
            "disk.", {‘host_state‘: host_state,
                       ‘requested_disk‘: requested_disk,
                       ‘usable_disk_mb‘: usable_disk_mb})
        return False

    disk_gb_limit = disk_mb_limit / 1024
    host_state.limits[‘disk_gb‘] = disk_gb_limit
    return True

资源超配与调度

即使 free_ram_mb 或 free_disk_gb 为负,虚拟机依旧有可能创建成功。事实上,当 nova-scheduler 在调度过程中,某些 filter 允许资源超配,比如 CPU、RAM 和 DISK 等 filter,它们默认的超配比为:

  • CPU: CONF.cpu_allocation_ratio = 16
  • RAM: CONF.ram_allocation_ratio = 1.5
  • DISK: CONF.disk_allocation_ratio = 1.0

以 ram_filter 为例,在根据 RAM 过滤宿主机时,过滤的原则为:

memory_limit = total_memory * ram_allocation_ratioused_memory = total_memory - free_memorymemory_limit - used_memory < flavor[‘ram‘],表示内存不足,过滤该宿主机;否则保留该宿主机。 

宿主机 RAM 和 DISK 的使用率往往要小于虚拟机理论使用的 RAM 和 DISK,在剩余资源充足的条件下,libvirt 将成功创建虚拟机。

内存和磁盘超配虽然能提供更多数量的虚拟机,当该宿主机上大量虚拟机的负载都很高时,轻着影响虚拟机性能,重则引起 qemu-kvm 相关进程被杀,即虚拟机被关机。

因此对于线上稳定性要求高的业务,建议不要超配 RAM 和 DISK,但可适当超配 CPU。建议这几个参数设置为:

  • CPU: CONF.cpu_allocation_ratio = 4
  • RAM: CONF.ram_allocation_ratio = 1.0
  • DISK: CONF.disk_allocation_ratio = 1.0
  • RAM-Reserve: CONF.reserved_host_memory_mb = 2048
  • DISK-Reserve: CONF.reserved_host_disk_mb = 20480

原文地址:https://www.cnblogs.com/gushiren/p/9512016.html

时间: 2024-10-03 23:17:44

Nova 如何统计 OpenStack 资源的相关文章

Nova 是如何统计 OpenStack 计算资源

引言 运维的同事常常遇到这么四个问题: Nova 是如何统计 OpenStack 计算资源的? 为什么 free_ram_mb, free_disk_gb 会是负数? 即使 free_ram_mb, free_disk_gb 为负数,为什么虚拟机依旧能创建成功? 因资源不足采用随机调度的方式会导致创建虚拟机失败,而指定 host 却能创建成功? 本文将从以上四个问题入手,结合 Kilo 版本 Nova 源码,在默认 Hypervisor 为 Qemu-kvm 的前提下(不同 Hypervisor

零基础学习openstack【完整中级篇】及openstack资源汇总

1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事,内容整合来自: 零基础学习openstack(上)[中级篇] 零基础学习openstack(下)[中级篇] 是在 零基础学习openstack[初级篇]基础上的一个继续: 初级篇,我们主要是有这么一个概念,openstack的组成openstack由哪些部分来组成: Identity(代号为“Ke

openstack资源整理一(转自陈沙克)

这些资料基本都是英文,不过整理一下,方便深入研究的朋友.下面的链接,估计不翻墙,基本是看不到.网站肯定是可以访问的.改天把这些资料放到国内的网盘上,给大家下载. Openstack最好的资料肯定是英文,推荐几个blog,这基本是我每周必看 http://www.mirantis.com/blog/ http://www.sebastien-han.fr/blog/ Grizzly的开发进度,这个大家比较关心,现在终于可以在一个页面看到全部项目的进展 http://wiki.openstack.o

##5.2 Nova计算节点--openstack

##5.2 Nova计算节点 ##5.2 Nova计算节点 # compute 安装 #5.2.Nova-compute.sh #基本配置: #关闭selinux.防火墙 #更换阿里源.升级.重启.时间同步 #hostname设置 #安装OpenStack库 #安装配置Nova yum install -y openstack-nova-compute yum install -y python-openstackclient openstack-selinux #设置Nova实例路径(磁盘镜像

##5.1 Nova控制节点--openstack

##5.1 Nova控制节点 ##5.1 Nova控制节点 # controller 安装 #5.1.Nova-controller.sh #创建Nova数据库.用户.认证,前面已设置 source ./admin-openstack.sh || { echo "加载前面设置的admin-openstack.sh环境变量脚本";exit; } # keystone上服务注册 ,创建nova用户.服务.API # nova用户前面已建 openstack service create -

OpenStack 计算服务Nova [四]

OpenStack 计算服务Nova [四] openstack 时间:2016年11月28日 Nova简介: Nova是openstack最早的两块模块之一,另一个是对象存储swift.在openstack体系中一个叫做计算节点,一个叫做控制节点.这个主要和nova相关,我们把安装为计算节点nova-compute,把除了nova-compute叫做控制节点.nova-compute是创建虚拟机的,只是创建虚拟机,所有的控制都在另一台上. nova有非常多的组件(服务) Nova服务介绍 AP

OpenStack 计算服务 Nova部署(七)

介绍 Nova是openstack最早的两块模块之一,另一个是对象存储swift.在openstack体系中一个叫做计算节点,一个叫做控制节点.这个主要和nova相关,我们把安装为计算节点nova-compute,把除了nova-compute叫做控制节点.nova-compute是创建虚拟机的,只是创建虚拟机,所有的控制都在另一台上. nova组件(服务) API:负责接受和响应外部请求.支持OpenStack API,EC2 API Cert:负责身份认证EC2 Scheduler:用于云主

关于OpenStack的学习路线及相关资源汇总

首先我们想学习openstack,那么openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更深层次的理解,当我们看到dashboard的时候,我们或许对openstack感觉有一点感性认识了.dashboard可以理解为openstack与用户交流的一个窗口,而dashboard对于真正的使用者来讲,它的功能上面有一定的局限性.而对于初学者通过它,可能会对openstack有一定的了解.o

Openstack之路(四)计算服务Nova

Nova的概述 Nova是Openstack云中的计算组织控制器.支持Openstack云中实例(Instances)生命周期的所有活动都由Nova处理.这样使得Nova成为一个负责管理计算资源.网络.认证.所需可扩展性的平台.但是Nova自身并没有提供任何虚拟化能力,相反它使用Libvirt API来与被支持的Hypervisors交互.Nova通过一个与Amazon Web Services(AWS)EC2 API兼容的Web Services API来对外提供服务. Nova的组件 Nov