揭开OpenStack 统计资源和资源调度的面纱

引言

运维的同事常常遇到这么四个问题:

  • 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 统计计算节点的四类计算资源:

1.CPU: 包括 vcpus(节点物理 cpu 总线程数), vcpus_used(该节点虚拟机的 vcpu 总和)

2.RAM: 包括 memory_mb(该节点总 ram),memory_mb_used(该节点虚拟机的 ram 总和),free_ram_mb(可用 ram)

Note: memory_mb = memory_mb_used + free_ram_mb

3.DISK:local_gb(该节点虚拟机的总可用 disk),local_gb_used(该节点虚拟机 disk 总和),free_disk_gb(可用 disk)

Note:local_gb = local_gb_used + free_disk_gb

4.其它:PCI 设备、CPU 拓扑、NUMA 拓扑和 Hypervisor 等信息

本文重点关注 CPU、RAM 和 DISK 三类资源。

Nova 如何收集资源

从 源码 可以看出,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 在上报资源至数据库前,还根据该节点上的虚拟机又做了一次资源统计。

Nova 资源再统计

首先分析为什么需要再次统计资源以及统计哪些资源。从 源码 可以发现,Nova 根据该节点上的虚拟机再次统计了 RAM、DISK 和 PCI 资源。

为什么需再次统计 RAM 资源?以启动一个 4G 内存的虚拟机为例,虚拟机启动前后,对比宿主机上可用内存,发现宿主机上的 free memory 虽有所减少(本次测试减少 600 MB),却没有减少到 4G,如果虚拟机运行很吃内存的应用,可发现宿主机上的可用内存迅速减少 3G多。试想,以 64G 的服务器为例,假设每个 4G 内存的虚拟机启动后,宿主机仅减少 1G 内存,服务器可以成功创建 64 个虚拟机,但是当这些虚拟机在跑大量业务时,服务器的内存迅速不足,轻着影响虚拟机效率,重者导致虚拟机 shutdown等。除此以外,宿主机上的内存并不是完全分给虚拟机,系统和其它应用程序也需要内存资源。因此必须重新统计 RAM 资源,统计的方式为:

free_memory = total_memory - CONF.reserved_host_memory_mb - 虚拟机理论内存总和

CONF.reserved_host_memory_mb:内存预留,比如预留给系统或其它应用

虚拟机理论内存总和:即所有虚拟机 flavor 中的内存总和

为什么要重新统计 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 中得磁盘总和

当允许资源超配(见下节)时,采用上述统计方式就有可能出现 free_ram_mb, free_disk_gb 为负。

资源超配与调度

即使 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_ratio

used_memory = total_memory - free_memory

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

相关代码如下(稍有精简):


  1. def host_passes(self, host_state, instance_type): 
  2.  
  3. """Only return hosts with sufficient available RAM.""" 
  4.  
  5. requested_ram = instance_type['memory_mb'] 
  6.  
  7. free_ram_mb = host_state.free_ram_mb 
  8.  
  9. total_usable_ram_mb = host_state.total_usable_ram_mb 
  10.  
  11. memory_mb_limit = total_usable_ram_mb * CONF.ram_allocation_ratio 
  12.  
  13. used_ram_mb = total_usable_ram_mb - free_ram_mb 
  14.  
  15. usable_ram = memory_mb_limit - used_ram_mb 
  16.  
  17. if not usable_ram >= requested_ram: 
  18.  
  19. LOG.debug("host does not have requested_ram") 
  20.  
  21. return False123456789101112 

宿主机 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

指定 host 创建虚拟机

本节用于回答问题四,当所有宿主机的资源使用过多,即超出限定的超配值时(total_resource * allocation_ratio),nova-scheduler 将过滤这些宿主机,若未找到符合要求的宿主机,虚拟机创建失败。

创建虚拟机的 API 支持指定 host 创建虚拟机,指定 host 时,nova-scheduler 采取特别的处理方式:不再判断该 host 上的资源是否满足需求,而是直接将请求发给该 host 上的 nova-compute。

相关代码如下(稍有精简):


  1. def get_filtered_hosts(self, hosts, filter_properties, 
  2.  
  3. filter_class_names=None, index=0): 
  4.  
  5. """Filter hosts and return only ones passing all filters.""" 
  6.  
  7. ... 
  8.  
  9. if ignore_hosts or force_hosts or force_nodes: 
  10.  
  11. ... 
  12.  
  13. if force_hosts or force_nodes: 
  14.  
  15. # NOTE(deva): Skip filters when forcing host or node 
  16.  
  17. if name_to_cls_map: 
  18.  
  19. return name_to_cls_map.values() 
  20.  
  21. return self.filter_handler.get_filtered_objects()123456789101112 

当该 host 上实际可用资源时满足要求时,libvirt 依旧能成功创建虚拟机。

最后,以一图总结本文内容

本文作者:布加迪

来源:51CTO

时间: 2024-12-05 00:50:01

揭开OpenStack 统计资源和资源调度的面纱的相关文章

Biz Stone 今天终于揭开了他的 Jelly 的神秘面纱

Twitter 联合创始人 Biz Stone 今天终于揭开了他的 Jelly 的神秘面纱,一个基于图片的社交问答移动社区,用户可以使用拍摄的图片作为问题,邀请朋友帮助他解答关于图片的具体问题. 从今早 Jelly 浮出水面开始,业界对于这个应用的评价也是褒贬不一,同时也有很多人疑问重重.但在与 Stone 交流过后,我觉得 Jelly 背后其实有更加独特和野心颇大的目标,最主要的就是增强用户的对周边世界的感情投入,使得回答任何问题的过程变得比问题本身更有意义. 用户使用 Jelly 来帮助别人

MESA:谷歌揭开跨中心超速数据仓库的神秘面纱

摘要: 谷歌近期发表了一篇关于最新大数据系统的论文,是关于Mesa这一全球部署的数据仓库,它可以在数分钟内提取上百万行,甚至可以在一个数据中心发生故障时依然运作. 谷歌正在为其一项令人兴奋的产品揭开面纱,它可能成为数据库工程史上的又一个壮举,这就是一个名为Mesa的数据仓库系统,它可以处理几乎实时的数据,并且即使一整个数据中心不幸脱机也可以发挥它的性能.谷歌工程师们正在为下个月将在中国举行的盛大的数据库会议准备展示其关于Mesa的论文. 该篇论文的摘要非常简练的概括了Mesa建立的意义和它所具备

搜索账号 排行榜客户端 Mesa——谷歌揭开跨中心超速数据仓库的神秘面纱

摘要:谷歌近期发表了一篇关于最新大数据系统的论文,是关于Mesa这一全球部署的数据仓库,它可以在数分钟内提取上百万行,甚至可以在一个数据中心发生故障时依然运作. 谷歌正在为其一项令人兴奋的产品揭开面纱,它可能成为数据库工程史上的又一个壮举,这就是一个名为Mesa的数据仓库系统,它可以处理几乎实时的数据,并且即使一整个数据中心不幸脱机也可以发挥它的性能.谷歌工程师们正在为下个月将在中国举行的盛大的数据库会议准备展示其关于Mesa的论文. 该篇论文的摘要非常简练的概括了Mesa建立的意义和它所具备的

为你揭开阿里云公安备案的神秘面纱!公安备案之新办网站申请-

在揭开之前咱们要搞明白三个问题: 一:公安备案和icp备案的区别  引用 ICP备案和公.安部备案一样都属国家要求的网站备案的一种.公安局备案一般按照各地公安机关指定的地点和方式进行.网站备案的目的就是为了防止在网上从事非法的网站经营活动,打击不良互联网信息的传播.两者不相冲突,无论企业是否有做过ICP备案,只要接到公安局备案电话,就得按要求去办理备案手续.  二:为什么要公安备案  引用 根据<中国人民共和国计算机信息系统安全保护条例>以及<计算机信息网络国际联网安全保护管理办法>

揭开OpenStack光鲜外表之下的阴暗

OpenStack Summit召开的几周前,一份新的报告发布.严肃的告诫了用户不要买进这个(或者任何)被吹的天花乱转的开源云平台. Gartner Reaearch 副总裁Lydia Leong建议持观望态度的用户要睁大眼睛看清:OpenStack在促进供应商结束封闭迈向开源的同时却把自己的一套封闭方案送了出去.她推荐使用可以运用在多种云平台上的第三方云管理工具或者API库. OpenStack:现实 vs 广告 Leong在报告(不要让OpenStack的炒作扭曲了你对云管理平台的选择)中写

揭开私服发布站推广的神秘面纱

相信大家都玩过游戏私服,那么我们从哪里找到私服的呢?对了!当然是私服发布站.好多人认为私服发布站是一个很神秘的行业.开过私服的业主大家都知道发布站是个暴利的行业,正是因为暴利才吸引了越来越多的人蜂拥而至.但是成功的总是少之又少,现在这个情况基本上是原来做的好的有经验的老站已经把市场给垄断,当一个新的网游私服出现的时候他们会迅速做出反应利用自身的经验和强大的财力,很快就占领了市场.由于暴利导致好多外行人走进其中而且好多人还是愿意往其中砸钱,但是由于经验的缺乏砸了钱到头来可能什么都没有得到,竹篮打水

【细说Java】揭开Java的main方法神秘的面纱(转)

大家都知道,main方法是Java应用程序的入口,其定义格式为: public static void main(String[] args) 可是为什么要这么定义呢?不这样定义可以么?main方法可以继承么?可以重载么?可以被其他方法调用么? 1. main方法为什么这么定义? (1) 因为main方法在启动时是通过Java的虚拟机,也就是JVM来调用的,并且没有通过对象的引用来调用,所以main方法是public和static的.而void是因为,main方法在退出时,没有给退出代码,而是在

揭开思科ASA防火墙网络军火的面纱

Shadow Brokers 曝出的EXTRABACON工具中包含思科ASA防火墙远程代码执行的0DAY漏洞,本文分析了ASA漏洞CVE-2016-6366的产生原因和利用原理,并对工具中的EXP的执行过程进行了深入分析,展示了网络设备漏洞攻防的分析和调试技巧和方法. 0x01 漏洞背景 今年8月13号,入侵美国国家安全局(NSA)的组织Shadow Brokers在其Twitter微博上公开了大量黑客工具的链接,并将部分放在网上进行拍卖.根据Shadow Brokers组织的描述,这些工具原属

美国Godaddy主机商揭开超级碗星期天广告的神秘面纱

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 "超级碗"(Super Bowl)即美国国家橄榄球联盟的年度冠军赛,一般在每年1月最后一个或2月第一个星期天举行,所以这一天也称为超级碗星期天(Super Bowl Sunday).今年已是3721.html">2014年1月23日了,这周日就是1月的最后一个星期天,也即是第48届的超级碗星期天即将到来.&