引言

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

  • 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. """Only return hosts with sufficient available RAM."""
  3. requested_ram = instance_type['memory_mb']
  4. free_ram_mb = host_state.free_ram_mb
  5. total_usable_ram_mb = host_state.total_usable_ram_mb
  6. memory_mb_limit = total_usable_ram_mb * CONF.ram_allocation_ratio
  7. used_ram_mb = total_usable_ram_mb - free_ram_mb
  8. usable_ram = memory_mb_limit - used_ram_mb
  9. if not usable_ram >= requested_ram:
  10. LOG.debug("host does not have requested_ram")
  11. 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. filter_class_names=None, index=0):
  3. """Filter hosts and return only ones passing all filters."""
  4. ...
  5. if ignore_hosts or force_hosts or force_nodes:
  6. ...
  7. if force_hosts or force_nodes:
  8. # NOTE(deva): Skip filters when forcing host or node
  9. if name_to_cls_map:
  10. return name_to_cls_map.values()
  11. return self.filter_handler.get_filtered_objects()123456789101112

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

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

本文作者:布加迪

来源:51CTO

揭开OpenStack 统计资源和资源调度的面纱相关推荐

  1. Nova 如何统计 OpenStack 计算资源(free_ram_mb, free_disk_gb)

    1)Nova 如何统计 OpenStack 计算资源? (2)为什么 free_ram_mb, free_disk_gb 有时会是负数? (3)即使 free_ram_mb, free_disk_gb ...

  2. exchange揭开拨号音还原法的神秘面纱

    之前exchange揭开拨号音还原法的神秘面纱英文版本的翻译,用了两周的时间翻译出来!图片感觉很小,可以下载附件直接查看,会更好! 揭开exchange拨号音恢复的方法(第一部分) 在这三部分系列里, ...

  3. 揭开KPI异常检测顶级AI模型面纱

    摘要:2020GDE全球开发者大赛-KPI异常检测告一段落,来自深圳福田莲花街道的"原子弹从入门到精通"有幸取得了总榜TOP1的成绩,在这里跟大家分享深圳福田莲花街道在本次比赛的解 ...

  4. 揭开程序员身上的「专业面纱」:非科班程序员,都来自哪些专业?

    [文章来源微信公众号:每天学编程] 专业选择重不重要?这几乎成了每年高考后的「全民话题」.有人说「专业决定就业」,有人说「职业无关专业」.对于程序员群体而言,大学专业对他们的职业选择发展又有着怎样的影 ...

  5. 轻轻揭开 b*tree 索引结构的神秘面纱

    李翔宇 云和恩墨西区技术专家 大家好,我是云和恩墨的技术专家李翔宇,今天要为大家分享的主题是<轻轻揭开b*tree索引结构的神秘面纱>. 说到索引,大家应该都或多或少的了解甚至熟悉它,它是 ...

  6. javascript关键字_让我们揭开JavaScript的“ new”关键字的神秘面纱

    javascript关键字 by Cynthia Lee 辛西娅·李(Cynthia Lee) 让我们揭开JavaScript的" new"关键字的神秘面纱 (Let's demy ...

  7. 揭开自然拼读法(Phonics)的神秘面纱

    揭开自然拼读法(Phonics)的神秘面纱 自然拼读法  (Phonics),是指看到一个单词,就可以根据英文字母在单词里的发音规律把这个单词读出来的一种方法.即从"字母发音-字母组合发音- ...

  8. 揭开BS架构酒店管理软件的面纱

    揭开BS架构酒店管理软件的面纱 目前市面上酒店管理软件无非是三种技术架构:BS模式(无客户端模式),CS模式(客户端模式),混合模式.BS模式就是我们常见的用IE等浏览器打开的网页,CS模式就是我们经 ...

  9. 揭开常见病毒免杀手法的面纱(浅论杀或者不杀.第二篇)

    你杀或者不杀我,我就在那里不悲不喜-- 借用黑客防线的名言:"在攻与防的对立统一中寻求突破!" 小甲鱼从现在开始就厚着脸皮跟大家来谈谈杀毒软件查杀病毒.木马的原理以及病毒.木马如何 ...

最新文章

  1. 图灵有奖书评征集活动第001期
  2. 如何知道当前像素的顶点坐标_GT 大神 | 如何高效渲染流体效果(绝对干货)
  3. python面试-Python面试
  4. map area 鼠标跟随
  5. RabbitMQ—流量控制之内存阈值
  6. MySQL IFNull 详解
  7. 学习日报 1029 sqlserver的初使用
  8. RTT的IPC机制篇——邮箱
  9. 滴滴上线特快和特惠:极端天气绝不动态加价
  10. 能玩游戏的计算机名字,没有手机和电脑时,孩子们最喜欢的游戏,简单却能玩上一整天!...
  11. python函数详解图_[宜配屋]听图阁
  12. 关于Activity跳转动画大汇总
  13. HTML5期末大作业:旅游网站设计——桂林旅游(3页) HTML+CSS+JavaScrip
  14. 非标自动化设备设计制造的13个步骤 || 技巧总结
  15. rpm包安装简单方法
  16. 蓝桥杯:三升排序——————Python
  17. 水文气象学数据可视化——Panoply软件的下载
  18. 为什么很多计算机专业大学生毕业后还会参加培训?
  19. 齐二TK6916/20/26/32系列数控落地铣镗床简介6
  20. BufferedReader读文件

热门文章

  1. CIA 数据泄露事件报告出炉:光为他人做嫁衣,自家着火不自知
  2. 统计学习方法---牛顿法
  3. ActiveMQ从入门到精通(二)
  4. 数据可视化(5)--jqplot经典实例
  5. JFinal 调用 oracle 存储过程的 步骤
  6. SQLite快速入门
  7. Linux下发生段错误时如何产生core文件-转
  8. OpenCV实现图像翻转
  9. 蓝桥杯 ALGO-5 算法训练 最短路
  10. 蓝桥杯 ALGO-86 算法训练 矩阵乘法