计算使用 nova-scheduler 服务来确定如何调度计算请求

默认配置中,调度程序会考虑以下所有条件的主机:

  • 位于请求的可用区 (map_az_to_placement_aggregate) 放置预过滤器中
  • 可以为请求提供服务,这意味着处理目标节点的 nova-compute 服务可用且未禁用(ComputeFilter)。
  • 满足与实例类型 (ComputeCapabilityFilter) 关联的额外规范。
  • 满足在实例的映像属性 (ImagePropertiesFilter) 上指定的任何体系结构、管理程序类型或虚拟机模式属性。
  • 与组的其他实例位于不同的主机上(如果请求)(ServerGroupAntiAffinityFilter)。
  • 位于一组组主机中(如果需要)(ServerGroupAffinityFilter)。

从主机撤离实例时,调度程序服务将遵循管理员在 nova evacuate 命令上定义的目标主机,如果管理员未定义目标,则调度程序将确定目标主机。

Prefilters

从 Rocky 版本开始,调度过程包括预过滤步骤,以提高后续阶段的效率。这些预过滤器在很大程度上是可选的,用于增强发送到放置的请求,以根据放置能够提前为我们回答的属性来减少候选计算主机集。

The Filter Scheduler(过滤器调度器)

删除了对自定义调度程序驱动程序的支持。 nova 现在仅支持过滤器调度程序。

Nova 的调度程序(称为过滤调度程序)支持过滤和加权,以便就应在何处创建新实例做出明智的决策。

当调度程序收到资源请求时,它首先应用过滤器来确定在分派资源时哪些主机有资格考虑,过滤器是二元的:过滤器要么接受主机,要么拒绝主机。然后,过滤器接受的主机将通过不同的算法进行处理,以决定哪些主机用于该请求,如“权重”部分所述。



filter_scheduler.available_filters 配置选项为计算服务提供可供调度程序使用的过滤器列表。默认设置指定计算服务中包含的所有过滤器。该配置选项可以指定多次。例如,如果您在 Python 中实现了自己的自定义过滤器(名为 myfilter)。如果您想同时使用内置过滤器和自定义过滤器,您的 nova.conf 文件将包含:

[filter_scheduler]
available_filters = nova.scheduler.filters.all_filters
available_filters = myfilter.MyFilter

nova.conf 中的 filter_scheduler.enabled_filters 配置选项定义 nova-scheduler 服务应用的过滤器列表。

Filters(过滤器)

以下部分描述了可用的计算过滤器

过滤器使用以下配置选项进行配置:

  • filter_scheduler.available_filters - 定义可供调度程序使用的过滤器类。该设置可以多次使用。
  • filter_scheduler.enabled_filters - 在可用过滤器中,定义调度程序默认使用的过滤器。

每个过滤器以不同的方式选择主机并具有不同的成本。filter_scheduler.enabled_filters的顺序影响调度性能。一般建议是尽快过滤掉无效主机,避免不必要的成本。我们可以按相反的顺序按成本对 filter_scheduler.enabled_filters 项目进行排序。例如,ComputeFilter 优于任何资源计算过滤器(如 NUMATopologyFilter)。

1、AggregateImagePropertiesIsolation

在 12.0.0 Liberty 之前,可以通过此过滤器指定和使用任意元数据。从 Liberty 开始,nova 仅解析标准元数据。如果您希望使用任意元数据,请考虑使用 AggregateInstanceExtraSpecsFilter 过滤器。

将图像元数据中定义的属性与聚合的属性进行匹配,以确定主机匹配:

  • 如果主机属于聚合,并且聚合定义了一个或多个与映像属性匹配的元数据,则该主机是启动映像实例的候选主机。
  • 如果主机不属于任何聚合,则它可以从所有映像启动实例。

例如,以下聚合 myWinAgg 将 Windows 操作系统作为元数据(名为“windows”):

openstack aggregate show myWinAgg
+-------------------+----------------------------+
| Field | Value |
+-------------------+----------------------------+
| availability_zone | zone1 |
| created_at | 2017-01-01T15:36:44.000000 |
| deleted | False |
| deleted_at | None |
| hosts | ['sf-devel'] |
| id | 1 |
| name | myWinAgg |
| properties | os_distro='windows' |
| updated_at | None |
+-------------------+----------------------------+

在此示例中,由于以下 Win-2012 映像具有 windows 属性,因此它在 sf-devel 主机上启动(所有其他过滤器相同):

openstack image show Win-2012
+------------------+------------------------------------------------------+
| Field | Value |
+------------------+------------------------------------------------------+
| checksum | ee1eca47dc88f4879d8a229cc70a07c6 |
| container_format | bare |
| created_at | 2016-12-13T09:30:30Z |
| disk_format | qcow2 |
| ... |
| name | Win-2012 |
| ... |
| properties | os_distro='windows' |
| ... |

您可以使用 nova.conf 文件中的以下选项来配置 AggregateImagePropertiesIsolation 过滤器:

  • filter_scheduler.aggregate_image_properties_isolation_namespace
  • filter_scheduler.aggregate_image_properties_isolation_separator

2、AggregateInstanceExtraSpecsFilter

将实例类型的额外规范中定义的属性与主机聚合上管理员定义的属性进行匹配。适用于aggregate_instance_extra_specs 范围内的规范。可以以逗号分隔的列表形式给出多个值。为了向后兼容,也适用于非范围规范;强烈建议不要执行此操作,因为当您启用这两个过滤器时,它会与 ComputeCapabilityFilter 过滤器发生冲突。

3、AggregateIoOpsFilter

使用每个聚合的 max_io_ops_per_host 值按磁盘分配过滤主机。如果未找到每个聚合值,该值回退到由:oslo.config:option:filter_scheduler.max_io_ops_per_host 配置选项定义的全局设置。如果主机属于多个聚合并且找到多个值,则将使用最小值。

4、AggregateMultiTenancyIsolation

确保租户隔离的主机聚合中的主机仅可供指定的一组租户使用。如果主机位于具有 filter_tenant_id 元数据键的聚合中,则主机只能从该租户或以逗号分隔的租户列表构建实例。主机可以位于不同的聚合中。如果主机不属于具有元数据键的聚合,则主机可以从所有租户构建实例。这不会限制租户在租户隔离聚合之外的主机上创建服务器。

例如,考虑有两个可用的主机用于调度:HostA 和 HostB。 HostB 处于与租户 X 隔离的聚合中。来自租户 X 的服务器创建请求将导致 HostA 或 HostB 在调度期间作为候选者。来自另一个租户 Y 的服务器创建请求将导致只有 HostA 成为调度候选者,因为 HostA 不是租户隔离聚合的一部分。

5、AggregateNumInstancesFilter

使用每个聚合的 max_instances_per_host 值,按实例数量过滤聚合中的主机。如果未找到每个聚合值,则该值将回退到由filter_scheduler.max_instances_per_host 配置选项定义的全局设置。如果主机属于多个聚合,因此找到多个值,则将使用最小值。

6、AggregateTypeAffinityFilter

如果实例风味的名称与聚合元数据中设置的instance_type 键匹配,或者未设置instance_type 键,则过滤聚合中的主机。

instance_type 元数据条目的值是一个字符串,可以包含单个instance_type 名称或以逗号分隔的instance_type 名称列表,例如m1.nano 或m1.nano,m1.small。

7、AllHostsFilter

这是一个无操作过滤器。它不会消除任何可用的主机。

8、ComputeCapabilitiesFilter

通过将实例类型额外规范中定义的属性与计算功能相匹配来过滤主机。如果额外的specs键包含冒号(:),则冒号之前的任何内容都将被视为命名空间,而冒号之后的任何内容都将被视为要匹配的键。如果命名空间存在且不是功能,则过滤器会忽略该命名空间。例如,capability:cpu_info:features 是有效的范围格式,为了向后兼容,如果不存在命名空间,过滤器还将额外的规范键视为要匹配的键;强烈建议不要执行此操作,因为当您启用这两个过滤器时,它会与 AggregateInstanceExtraSpecsFilter 过滤器发生冲突。

9、ComputeFilter

通过所有可操作且已启用的主机。

一般来说,您应该始终启用此过滤器。

10、DifferentHostFilter

将实例安排在一组实例中不同的主机上。要利用此过滤器,请求者必须传递调度程序提示,使用 different_host 作为键,使用实例 UUID 列表作为值。此过滤器与 SameHostFilter 相反。

例如,当使用** openstack server create** 命令时,请使用 --hint 标志:

openstack server create \
--image cedef40a-ed67-4d10-800e-17455edce175 --flavor 1 \
--hint different_host=a0cf03a5-d921-4877-bb5c-86d26cf818e1 \
--hint different_host=8c19174f-4220-44f0-824a-cd1eeef10287 \
server-1

对于 API,请使用 os:scheduler_hints 键。例如:

{
"server": {
"name": "server-1",
"imageRef": "cedef40a-ed67-4d10-800e-17455edce175",
"flavorRef": "1"
},
"os:scheduler_hints": {
"different_host": [
"a0cf03a5-d921-4877-bb5c-86d26cf818e1",
"8c19174f-4220-44f0-824a-cd1eeef10287"
]
}
}

11、ImagePropertiesFilter

根据实例映像上定义的属性过滤主机。它传递可以支持实例中包含的指定映像属性的主机。属性包括体系结构、虚拟机管理程序类型、虚拟机管理程序版本和虚拟机模式。

例如,实例可能需要运行基于 ARM 的处理器和 QEMU 作为虚拟机管理程序的主机。您可以使用以下属性来装饰图像:

openstack image set --architecture arm --property img_hv_type=qemu img-uuid

过滤器检查的图像属性是:

hw_architecture(硬件架构)

描述镜像所需的机器架构。示例包括 i686、x86_64、arm 和 ppc64。

img_hv_type

描述映像所需的虚拟机管理程序。例如 qemu 和 hyperv。

img_hv_requested_version

hw_vm_mode

12、IsolatedHostsFilter

允许管理员定义一组特殊(隔离)映像和一组特殊(隔离)主机,使得隔离映像只能在隔离主机上运行,并且隔离主机只能运行隔离映像。标志 limit_isolated_hosts_to_isolated_images 可用于强制隔离主机仅运行隔离映像。

过滤器内的逻辑取决于restrict_isolated_hosts_to_isolated_images 配置选项,该选项默认为True。当为 True 时,卷支持的实例将不会放置在隔离主机上。当为 False 时,卷支持的实例可以运行在任何主机上,无论是否隔离。

管理员必须使用filter_scheduler.isolated_hosts 和filter_scheduler.isolated_images 配置选项指定隔离的映像和主机集。例如:

[filter_scheduler]
isolated_hosts = server1, server2
isolated_images = 342b492c-128f-4a42-8d3a-c5088cf27d13, ebd267a6-ca86-4d6c-9a0e-bd132d6b7d09

您还可以使用 filter_scheduler.restrict_isolated_hosts_to_isolated_images 配置选项指定隔离主机仅用于特定的隔离映像。

13、IoOpsFilter

按主机上的并发 I/O 操作过滤主机。并发 I/O 操作过多的主机将被过滤掉。filter_scheduler.max_io_ops_per_host 选项指定允许在主机上运行的 I/O 密集型实例的最大数量。如果主机上运行的构建、调整大小、快照、迁移、救援或取消搁置任务状态的实例数量超过filter_scheduler.max_io_ops_per_host,则调度程序将忽略该主机。

14、JsonFilter

不常用,省略

15、NumInstancesFilter

与 MetricsWeigher 秤配合使用。过滤不报告metrics.weight_setting中指定指标的主机,从而确保指标权重器不会因这些主机而失败。

16、PciPassthroughFilter

如果主机具有满足风味的 extra_specs 属性中的设备请求的设备,则过滤器会在主机上调度实例。

如果使用具有 PCI 设备请求的实例或在主机上使用基于 SR-IOV 的网络,则此过滤器至关重要。

17、SameHostFilter

将实例安排在与一组实例中的所有其他实例相同的主机上。要利用此过滤器,请求者必须传递调度程序提示,使用 same_host 作为键,使用实例 UUID 列表作为值。此过滤器与 DifferentHostFilter 相反。

例如,当使用 openstack server create 命令时,请使用 --hint 标志:

openstack server create \
--image cedef40a-ed67-4d10-800e-17455edce175 --flavor 1 \
--hint same_host=a0cf03a5-d921-4877-bb5c-86d26cf818e1 \
--hint same_host=8c19174f-4220-44f0-824a-cd1eeef10287 \
server-1

对于 API,使用 os:scheduler_hints 键:

{
"server": {
"name": "server-1",
"imageRef": "cedef40a-ed67-4d10-800e-17455edce175",
"flavorRef": "1"
},
"os:scheduler_hints": {
"same_host": [
"a0cf03a5-d921-4877-bb5c-86d26cf818e1",
"8c19174f-4220-44f0-824a-cd1eeef10287"
]
}
}

18、ServerGroupAffinityFilter

将属于同一服务器组的实例限制在同一主机上。要利用此过滤器,请求者必须创建具有关联性策略的服务器组,并传递调度程序提示,使用组作为键,使用服务器组 UUID 作为值。

例如,当使用 openstack server create 命令时,请使用 --hint 标志:

openstack server group create --policy affinity group-1
openstack server create --image IMAGE_ID --flavor 1 \
--hint group=SERVER_GROUP_UUID server-1

19、ServerGroupAntiAffinityFilter

将属于服务器组的实例限制为单独的主机。要利用此过滤器,请求者必须创建一个具有反关联策略的服务器组,并传递调度程序提示,使用组作为键,使用服务器组 UUID 作为值。

例如,当使用 openstack server create 命令时,请使用 --hint 标志:

openstack server group create --policy anti-affinity group-1
openstack server create --image IMAGE_ID --flavor 1 \
--hint group=SERVER_GROUP_UUID server-1

20、SimpleCIDRAffinityFilter

Weights(权重)



当资源实例时,过滤器调度程序对可接受主机列表中的每个主机进行过滤和加权。每次调度程序选择一个主机时,它实际上都会消耗该主机上的资源,并且后续的选择也会相应地进行调整。当客户请求相同数量的实例时,此过程非常有用,因为会为每个请求的实例计算权重。

为了确定一个权重器相对于另一个权重器的优先级,所有权重器必须定义一个乘数,该乘数将在计算节点的权重之前应用。所有权重都预先标准化,以便可以轻松应用乘数。

因此该物体的最终权重将是:

weight = w1_multiplier * norm(w1) + w2_multiplier * norm(w2) + ...

主机根据以下配置选项进行加权:

  • filter_scheduler.host_subset_size
  • filter_scheduler.weight_classes

RAMWeigher

CPUWeigher

DiskWeigher

MetricsWeigher

IoOpsWeigher

PCIWeigher

ServerGroupSoftAffinityWeigher

ServerGroupSoftAntiAffinityWeigher

BuildFailureWeigher

CrossCellWeigher

HypervisorVersionWeigher

NumInstancesWeigher

Utilization-aware scheduling

OpenStack调度器的更多相关文章

  1. 大数据之Yarn——Capacity调度器概念以及配置

    试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...

  2. [Spring]支持注解的Spring调度器

    概述 如果想在Spring中使用任务调度功能,除了集成调度框架Quartz这种方式,也可以使用Spring自己的调度任务框架. 使用Spring的调度框架,优点是:支持注解(@Scheduler),可 ...

  3. 编写简单的ramdisk(选择IO调度器)

    前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...

  4. Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析

    最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题.本文首先简单介绍脏调度器机制的用法,然后简 ...

  5. 【Cocos2d-x 3.x】 调度器Scheduler类源码分析

    非个人的全部理解,部分摘自cocos官网教程,感谢cocos官网. 在<CCScheduler.h>头文件中,定义了关于调度器的五个类:Timer,TimerTargetSelector, ...

  6. [原创]cocos2d-x研习录-第三阶 特性之调度器

    在游戏中,经常会周期执行一些检测.操作或更新一些数据等,我们称之为调度.Cocos2D-x中将调度封装为类CCScheduler,方便在游戏开发中使用.我们一起来学习一下,CCScheduler具有哪 ...

  7. Storm-隔离调度器

    这个版本的亮点是新的“隔离调度器”,使得在一些拓扑中分享集群变得简单和安全.隔离调度程序允许您指定哪些拓扑应该“孤立”, 这意味着它们运行在集群中的一组专用的机器,没有其他的拓扑将运行.这些孤立的拓扑 ...

  8. 人人都是 DBA(III)SQL Server 调度器

    在 SQL Server 中,当数据库启动后,SQL Server 会为每个物理 CPU(包括 Physical CPU 和 Hyperthreaded)创建一个对应的任务调度器(Scheduler) ...

  9. IO调度器

    由于对blktrace的好奇,来到了block层.通过阅读block层的代码,自己的几个错误认知被纠正,比如 一) 同步操作时,进程是在驱动中睡觉真实情况是:进程在文件系统睡觉 二) 对同一个数据块的 ...

  10. Linux IO Scheduler(Linux IO 调度器)

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

随机推荐

  1. Nginx的日志处理

    Nginx的日志处理 背景 之前一直被各种咨询nginx的使用问题. 大部分都是性能, 加模块, 以及一些tcp端口等的问题. 其实这些都还好, 还有一个比较麻烦的问题时日志相关的. nginx的日志 ...

  2. ingress nginx 支持的K8S版本以及nginx版本信息

  3. [转帖]MySQL定点数类型DECIMAL用法详解

    https://www.cnblogs.com/danielzzz/p/16824214.html 一.MySQL DECIMAL 的使用 DECIMAL 数据类型用于在数据库中存储精确的数值,我们经 ...

  4. [转帖]AHCI到NVMe,SSD的关键科技革命

      https://baijiahao.baidu.com/s?id=1718020841628703656&wfr=spider&for=pc HDD和早期SSD大部分使用SATA接 ...

  5. [转帖] Linux命令拾遗-网络抓包工具

    https://www.cnblogs.com/codelogs/p/16060684.html 简介# Linux中有很多抓包工具,如ngrep.tcpdump与tshark等,它们有很多用法与使用 ...

  6. Linux KVM网络处理过程

    Linux KVM网络处理过程 总体解决方法 本次遇到的问题是KVM的网桥处理不小心导致系统无法连接.处理简要总结: 进入机房,给IPMI插上网线, 开机点 Del 进入bios 设置IMPI的地址 ...

  7. Jumper Server 堡垒机搭建过程

    Jumper Server 堡垒机搭建过程 背景说明 公司组织考核, 要对一套系统进行安全设置.有一个项目是使用堡垒机进行登录 堡垒机有多种用途,可以实现日志审计和安全设置等. 买商业设备的话太困难了 ...

  8. 两千字讲明白java中instanceof关键字的使用!

    写在开头 在过往的内容中,我们讲了不少的Java关键字,比如final.static.this.super等等,Java中的关键字非常之多,下图是整理的关键字集合 而我们今天要学习的就是其中的inst ...

  9. Java单元测试浅析(JUnit+Mockito)

    作者:京东物流 秦彪 1. 什么是单元测试 (1)单元测试环节: 测试过程按照阶段划分分为:单元测试.集成测试.系统测试.验收测试等.相关含义如下: 1)       单元测试: 针对计算机程序模块进 ...

  10. 本地搭建playground

    本文主要是记录我搭建go playground的步骤. 1.安装docker 如果你使用的Ubuntu,docker的安装步骤可以参见这里,这是我之前写的在Ubuntu18.04下安装fabric,其 ...