文档章节

【翻译】Nova过滤调度器

zhouxingxing
 zhouxingxing
发布于 2012/11/16 08:55
字数 2855
阅读 1928
收藏 2
点赞 0
评论 0

注:过滤器可以为创建虚拟机设置条件,简单来讲提供了管理的功能,例如前两天在群里看见有人自己写的filter限制一台设备最多只能创建5台虚拟机等。


原文:http://docs.openstack.org/developer/nova/devref/filter_scheduler.html    

过滤调度器支持filtering和weighting来决定,新创建的实例的位置。调度器的支持只工作在计算节点。

过滤器(filtering)


    过滤调度器首先生成一个字典包含没有过滤的hosts,然后过滤它们使用过滤属性,最后选择hosts为请求的实例数(每次它选择开销最小的主机然后调节它到选择列表)。

    如果它出现,它不能为下一个实例找到候选。它意味着这没有更多合适的实例。

    如果我们谈起filtering和weighting ,在过滤调度器中它们的工作相当的灵活。调度器支持多种的过滤策略。同样你甚至可以实现你自己的过滤算法。

    下面是一些标准的过滤类(nova.scheduler.filters):


  • AllHostsFilter - 坦白的说,这个过滤器没有做任何操作,它通过所有的有效hosts。
  • ImagePropertiesFilter - 过滤hosts基于的属性定义在实例的镜像中。它通过的hosts可以支持特殊的镜像属性包含在实例中。
  • AvailabilityZoneFilter - 过滤hosts通过域的可用性。它通过hosts匹配可用的域指定在实例的属性中。
  • ComputeCapabilityFilter - 检查host提供的计算服务能力满足外部的规定与实例相关的类型(没有范围,更多描述,参考TrustedFilter)。额外的规定可以有一个运算符在键值对的开始处。如果这没有运算符指定。那么一个默认的运算符's=='被使用,有效的运算符:

* = (equal to or greater than as a number; same as vcpus case)
* == (equal to as a number)
* != (not equal to as a number)
* >= (greater than or equal to as a number)
* <= (less than or equal to as a number)
* s== (equal to as a string)
* s!= (not equal to as a string)
* s>= (greater than or equal to as a string)
* s> (greater than as a string)
* s<= (less than or equal to as a string)
* s< (less than as a string)
* <in> (substring)
* <or> (find one of these)

Examples are: ">= 5", "s== 2.1.0", "<in> gcc", and "<or> fpu <or> gpu"


  • AggregateInstanceExtraSpecsFiter - 检查元数据满足任何额外的规定和实例的类型有关(没有范围)。通过hosts可以创建指定的实例类型。额外的规定可以有同样的运算符例如ComputeCapabilityFilter。
  • ComputeFilter - 通过所有的hosts,那些可操作的和启用的。
  • CoreFilter - 过滤基于CPU核利用率。它通过hosts有充足的CPU核。
  • IsolatedHostsFilter - 过滤居于"image_isolated"和"host_isolated"标记。
  • JsonFilter - 允许简单的基于JSON语法来选择hosts。
  • RamFilter - 过滤hosts通过它们的RAM,只有hosts有充足的RAM被通过。
  • SimpleCIDRAffinityFilter - 允许put一个新的实例在一个host中通过相同的IP块。
  • DifferentHostFilter - 允许put实例在不同的host从一组实例。
  • SameHostFilter - put实例到同一个host作为另一个实例在一组实例中。
  • RetryFilter - 过滤hosts那些已经试图被调度的。只通过hosts那些之前没有被尝试的。
  • TrustedFilter - 过滤hosts棘突它们的信任度。只通过那些满足信任需求的指定在实例的属性中。
  • TypeAffinityFilter - 只通过hosts那些还没有运行实例的请求类型。
  • AggregateTypeAffinityFilter - 限制instance_type通过集合。


    现在我们可以详细地关注这些标准的过滤类。我将pass简单的那些,例如AllHostsFilter,CoreFilter和RamFilter,因为他们的功能非常的简单和可以从代码上就能够理解。例如类RamFilter有下面的实现:

class RamFilter(filters.BaseHostFilter):
    """Ram Filter with over subscription flag"""

    def host_passes(self, host_state, filter_properties):
        """Only return hosts with sufficient available RAM."""
        instance_type = filter_properties.get('instance_type')
        requested_ram = instance_type['memory_mb']
        free_ram_mb = host_state.free_ram_mb
        total_usable_ram_mb = host_state.total_usable_ram_mb
        used_ram_mb = total_usable_ram_mb - free_ram_mb
        return total_usable_ram_mb * FLAGS.ram_allocation_ratio - used_ram_mb >= requested_ram

这里ram_allocation_ratio 意味着虚拟的RAM到物理的RAM分配比率(默认为1.5)。确实,很简单。

    下一个要描述的标准的过滤器是AvailabilityZoneFilter ,它也不是很困难。这过滤器只是研究计算节点的可用性区域和从请求中的属性的可用性区域。每个计算服务有它自己的可用区域。所以部署工程师有一个选项来运行调度器支持可用区域和配置每个主机的可用区域。这个类方法host_passes返回true一旦可用区域请求中提及的和当前的计算主机一致。

    ImagePropertiesFilter 过滤hosts基于架构,hypervisor类型,和虚拟机模式指定在实例中。例如,一个实例或许需要一个host支持arm建构在一个qemu计算host。ImagePropertiesFilter将只通过hosts那些可以满值这个请求的。这些实例属性来源于实例的镜像。例如 一个镜像可以被装饰属性通过使用glance image-update img-uuid-property architecture=arm-property hypervisor_type=qemu 只有hosts满足这些需求将会通过ImagePropertiesFilter。

    ComputeCapabilitesFilter 检查是否host满足任何的'extra specs'指定的实例类型。'extra specs'可以包含键值对,ComputeCapabilitiesFilter将只通过hosts,能力满足请求的规定。所有的hosts被通过如果没有'extra specs'被指定。

    ComputeFilter 是非常简单,通过任何的host,只要计算服务是可用的。

    现在我们介绍IsolatedHostsFilter。这可以一些特殊的hosts保留给指定的images。这些hosts被称作isolated。所以运行在孤立hosts上的镜像也被称作isolated。这个调度器检查是否image_isolated标志命名在实例规定和在host中的一致。

    DifferentHostFilter - 它的方法 host_passes 返回True 一旦host主机将实例在不同于使用的所有主机实例集。

    SameHostFilter 和DifferetHostFilter相反。

    SimpleCIDRAffinityFilter 研究子网掩码然后调查是否当球的主机的网路地址和子网一致作为它定义在请求中。

    JsonFilter - 这个过滤提供这个机会来写复杂的查询对于hosts能力过滤。基于简单的类json语法。可以使用下面的操作对于host状态属性:'=','<','>','in','<=','>=',可以结合下面的逻辑操作:'not','or','and'。例如,你可以在测试中看点下面的查询:

['and',

    ['>=', '$free_ram_mb', 1024],

    ['>=', '$free_disk_mb', 200 * 1024]

]

这个查询将会过滤所有的hosts多余的剩余RAM空间或者至少1024MB,同事有剩余的磁盘空间或者至少200GB。

    许多过滤使用的数据来自scheduler_hints,它被定义在用户创建一个服务器的时候。这个规定的唯一例外就是JsonFilter,它获得数据在一些奇怪困难与理解的方式。

    RetryFilter过滤hosts那些已经尝试调度的。只通过hosts那些还没有在之前被尝试过的。

    TrustedFilter 过滤hosts基于信任度。只通过hosts那些匹配信任请求在'extra_specs'z中的值的。这个值对于这个过滤是'trust:trusted_host','trust'是这个值的范围,'trusted_host'是实际的值。('trusted'/'untrusted')的值必须匹配完整的一个host(经过认证服务)在它通过TrustedFilter之前。

为了使用你指定的过滤器下面的两个设置:


  • scheduler_available_filters - 定义过滤器类可用与调度。这个设置可以被多次使用。
  • scheduler_default_filters - 可以用的过滤器,定义那些调度器默认使用的。

默认值在nova.conf中:

--scheduler_available_filters=nova.scheduler.filters.standard_filters --scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilityFilter,ImagePropertiesFilter

有了这个配置。所有的过滤器在nova.scheduler.filters将会可用。默认下RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilityFilter,ImageProperTiesFilter将会被使用。

    如果你想建立你自己的过滤器你只需要继承 BaseHostFilter然后实现一个方法:host_passes.这个方法应该返回True如果host通过过滤。它需要host_state和filter_properties字典作为参数。

例如,nova.conf可以包含下面的调度相关的设置:

--scheduler_driver=nova.scheduler.FilterScheduler --scheduler_available_filters=nova.scheduler.filters.standard_filters --scheduler_available_filters=myfilter.MyFilter --scheduler_default_filters=RamFilter,ComputeFilter,MyFilter
有了这些设置,nova将会使用FilterScheduler作为调度驱动。标准的nova过滤器和我的过滤器可以被FilterScheduler调用。RamFilter,ComputeFilter,和我的过滤器默认下使用当没有过滤器被指定在请求中。


损耗 和 权重

过滤调度器使用所谓的weights(权重)和costs(损耗)在它们工作的时候。

    costs是计算的整数,表达hosts测量被选择合适的结果对于请求。当然。costs被计算由于hosts特点和请求中的特点匹配。所以尝试put实例在一个不适合的host(例如,尝试put一个非常简单的实例在一台高性能的主机上)将会有高的costs,put实例在一个适合的主机将会较少。

所以,让我们找出,这一切的计算工作是如何发生的。

在weighting之前,过滤调度器创建一个元祖列表包含weight和cost功能来用来weighing hosts。这些功能可以从缓存中获取,如果这些操作在之前已经做了(这个缓存依赖节点),过滤调度器值工作在计算节点,过滤调度器尝试获取这个cost功能通过nova.conf。Weight在元祖中表示cost功能的weight的匹配。它同样可以被获取通过nova.conf。在调度weights主机后,使用选定的cost功能。它做这些通过weighted_sum方法。参数是:

  • weighted_fns - wights创建的有cost功能的列表;
  • host_states - 被weighted的主机;
  • weighing_properties - 可以影响weigth的字典值。

这个方法首先创建一个网格功能的结果(它只是计算每个功能使用host_state和weighing_properties的值)- 分数,每行一个host每列一个功能。下一步是计算这个值从每个单元从网格中。最后一个计算每行的总数-这将是host的weight,这个方法返回这host有最少的weight-最佳的一个。

如果我们集中于cost功能,它将会意味着我们使用compute_fill_first_cost_fn 功能默认下,只是简单的返回了有剩余RAM空间的hosts:

def compute_fill_first_cost_fn(host_state, weighing_properties):                             """More free ram = higher weight. So servers will less free ram will be                  preferred."""                                                                     return host_state.free_ram_mb
你能实现你自己的cost功能变体对于主机的能力你想去涉及的。使用不同的cost功能(正如你所知的,同一时间可以有许多被使用的)可以灵活选择下一个用来创建新实例的主机。

这些cost功能应该安装在nova.conf中通过标识least_cost_functions(这可以有更多的更通过逗号隔开)。默认这行应该是:

--least_cost_functions=nova.scheduler.least_cost.compute_fill_first_cost_fn
至于cost功能的weights,它们也要描述在nova.conf。这行描述看看起来下面的方式:function_name_weight.

至于默认的cost功能,:compute_fill_first_cost_fn_weight,默认是-1.0.

--compute_fill_first_cost_fn_weight=-1.0
消极的功能的weight意味着计算节点有更多剩余RAM空间,更好的是,Nova尝试分离实例尽可能的覆盖计算节点。积极的weight意味着Nova 将首先添满一个单独的计算节点。

过滤调度器找到通过重复filtering和weighing找到了可以接受的列表。每次它选择一个host,它消耗了它上面的资源,所以随后的选择可以进行调节。一旦客户要求大数量的实例的时候非常的有用,因为weight被计算对于每一个实例的请求。


最后过滤调度器排序选择的hosts通过它们的weight和规定它们上面的实例。



© 著作权归作者所有

共有 人打赏支持
zhouxingxing
粉丝 71
博文 69
码字总数 48470
作品 0
杭州
程序员
看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)

本节重点介绍 nova-scheduler 的调度机制和实现方法:即解决如何选择在哪个计算节点上启动 instance 的问题。 创建 Instance 时,用户会提出资源需求,例如 CPU、内存、磁盘各需要多少。 Op...

CloudMAN
2016/04/29
416
6
OpenStack Nova:在一个 Hypervisor 上配置多个 Ceph 后端

使用多个后端配置一个 Nova hypervisor,用来存储实例的根短暂磁盘。 I. 基本原理 这里最主要的是可以充分使用你 hypervisors 上的资源。目前,Nova 不支持多个 image_type后端,也就是说不同...

OSC编辑部
2015/09/17
593
0
掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)

上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler。 创建 Volume 时,cinder-scheduler 会基于容量、Volume Type 等条件选择出最合适...

CloudMAN
2016/06/17
241
0
OpenStack 计算服务Nova [四]

OpenStack 计算服务Nova [四] OpenStack 计算服务Nova [四] Nova简介:   Nova是openstack最早的两块模块之一,另一个是对象存储。在openstack体系中一个叫做,一个叫做。这个主要和nova相...

Abcdocker
2016/11/28
0
0
OpenStack 计算服务Nova [四]

Nova简介:   Nova是openstack最早的两块模块之一,另一个是对象存储。在openstack体系中一个叫做,一个叫做。这个主要和nova相关,我们把安装为计算节点,把除了nova-compute叫做控制节点...

一盏烛光
2017/06/18
0
0
Nova 是如何统计 OpenStack 资源

引言 运维的同事常常遇到这么四个问题: Nova 如何统计 OpenStack 计算资源? 为什么 freerammb, freediskgb 有时会是负数? 即使 freerammb, freediskgb 为负,为什么虚拟机依旧能创建成功?...

koala bear
2015/05/01
0
0
common library in nova (1

本文转载至www.x9byod.com nova中把通用的功能模块放在openstack/common下,实现了很多基本的常用功能,比如log,time,包引用等等;这个模块与其它模块高度独立,因此可以被很容易的被各个模...

yuiluv
2013/09/09
0
0
nova创建虚拟机的过程(二)

总体描述: 1. 创建实例接口 还是先看接口API REQ: curl -i 'http://ubuntu80:8774/v2/0e962df9db3f4469b3d9bfbc5ffdaf7e/servers' -X POST -H "Accept: application/json" -H "Content-Typ......

无若
2016/03/08
514
0
OpenStack架构快速了解

OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟计算或存储服务的云,为...

xpleaf
2017/02/19
0
0
云计算之OpenStack实战记(一)与埋坑填坑

一、了解Openstack 1.1 OpenStack简介  OpenStack是一整套开源软件项目的综合,它允许企业或服务提供者建立、运行自己的云计算和存储设施。Rackspace与NASA是最初重要的两个贡献者,前者提供...

linuxzkq
2016/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式

1.装饰器模式 概念 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。 实现 增加一个修饰类包裹原来的...

EasyProgramming
10分钟前
1
0
用python2和opencv进行人脸识别

一、安装cv2 sudo apt-get install python-opencv opencv-data 二、 Haar特征分类器 Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。 ...

wangxuwei
10分钟前
0
0
python模板中循环字典

{% for k,v in user.items %} {{ k}} {{ v}} {% endfor %}

南桥北木
38分钟前
0
0
Java8系列之重新认识HashMap

简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类...

HOT_POT
42分钟前
0
0
获取调用方的className

/** * 获取调用方的class * @return */private static String getInvoke() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); S......

iborder
59分钟前
0
0
深入了解一下Redis的内存模型!

一前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符...

Java填坑之路
今天
1
0
从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择

背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加。在这个背景下,平台的技术架构也完成了从传统的单体应用到微...

老道士
今天
1
0
大数据学习的各个阶段

第一阶段:Linux课程讲解Linux基础操作,讲的是在命令行下进行文件系统的操作,这是Hadoop学习的基础,后面的所有视频都是基于linux操作的。鉴于很多学员没有linux基础,特增加该内容,保证零linux...

董黎明
今天
0
0
CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
今天
7
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部