架构解读丨Volcano做业资源预留设计原理

摘要:本文重点讲解了基于v1.1.0的目标做业资源预留特性的设计和最佳实践。讲解过程当中,全面介绍了特性设计过程当中的考量因素和算法设计。

资源预留(Reservation)是批处理系统的一类常见需求,也是公平性调度(Fair Scheduling)的补充。从不一样维度来看,资源预留能够分为抢占式预留和非抢占式预留、做业资源预留和队列资源预留、即时预留和预见性预留等。自v1.1.0开始,Volcano开始迭代支持资源预留特性。根据社区Roadmap,v1.1.0(已发布)优先支持做业资源预留,v1.2.0将支持指定队列资源预留。node

场景分析

在实际应用中,常见如下两种场景:算法

(1)在集群资源不足的状况下,假设处于待调度状态的做业A和B,A资源申请量小于B或A优先级高于B。基于默认调度策略,A将优先于B进行调度。在最坏的状况下,若后续持续有高优先级或申请资源量较少的做业加入待调度队列,B将长时间处于饥饿状态并永远等待下去。性能

(2)在集群资源不足的状况下,假设存在待调度做业A和B。A优先级低于B但资源申请量小于B。在基于集群吞吐量和资源利用率为核心的调度策略下,A将优先被调度。在最坏的状况下,B将持续饥饿下去。spa

以上两种场景出现的根因是缺乏一种公平调度机制:保证长期处于饥饿状态的做业在达到某个临界条件后被优先调度。形成做业持久饥饿的缘由不少,包括资源申请量长时间没法知足、优先级持续太低、抢占发生频率太高、亲和性没法知足(v1.1.0暂不支持此场景)等,以资源申请量没法知足最为常见。设计

特性设计

为了保证长期处于阻塞状态的做业可以拥有公平的调度机会,须要解决两个主要问题:日志

  • 如何识别目标做业?
  • 如何为目标做业预留资源?

一、目标做业识别

  • 做业条件

做业条件的选定能够基于等待时间、资源申请量等单个维度或多个维度的组合。综合考虑,v1.1.0实现版本选择优先级最高且等待时间最长的做业做为目标做业。这样不只能够保证紧急任务优先被调度,等待时间长度的考虑默认筛选出了资源需求较多的做业。code

  • 做业数量

客观来讲,知足条件的做业一般不止一个,能够为目标做业组或单个目标做业预留资源。考虑到资源预留必然引发调度器性能在吞吐量和延时等方面的影响,v1.1.0采用了单个目标做业的方式。orm

  • 识别方式

识别方式有两种:自定义配置和自动识别。v1.1.0暂时仅支持自动识别方式,即调度器在每一个调度周期自动识别符合条件和数量的目标做业,并为其预留资源。后续版本将考虑在全局和Queue粒度支持自定义配置。blog

二、资源预留算法

资源预留算法是整个特性的核心。v1.1.0采用节点组锁定的方式为目标做业预留资源,即选定一组符合某些约束条件的节点归入节点组,节点组内的节点从归入时刻起再也不接受新做业投递,节点规格总和知足目标做业要求。须要强调的是,目标做业将能够在整个集群中进行调度,非目标做业仅可以使用节点组外的节点进行调度。排序

  • 节点选取

在特性设计阶段,社区考虑过如下节点选取算法:规格优先、空闲优先。

规格优先是指集群中全部节点按照主要规格(目标做业申请资源规格)进行降序排序,选取前N个节点归入节点组,这N个节点的资源总量知足申请量。这种方式的优势是实现简单、锁定节点数量最小化、对目标做业的调度友好(这种方式锁定的资源总量每每比申请总量大一些,且做业中各Pod容易汇集调度在锁定节点,有利于Pod间通讯等);缺点是锁定资源总量大几率不是最优解、综合调度性能损失(吞吐量、调度时长)、易产生大资源碎片。v1.1.0的实现采用的是该算法。

空闲优先是指集群中全部节点按照主要资源类型(目标做业申请资源类型)的空闲资源量进行降序排序,选取前N个节点归入节点组,这N个节点的资源总量知足申请量。这种方式的优势是较大几率最快腾出知足要求的资源总量;缺点是集群空闲资源分布的强动态性致使节点组不是最优解,所求解稳定性差。

  • 节点数量

为了尽量减小锁定操做对调度器综合性能的影响,在知足预留资源申请量的前提下,不管采用哪一种节点选取算法,都应保证所选节点数最少。

  • 锁定方式

锁定方式包括两个核心考量点:并行锁定数量、锁定节点已有负载处理手段。

并行锁定数量有三个选择:单节点锁定、多节点锁定、集群锁定。单节点锁定是指每一个调度周期内基于当前集群资源分布选定一个符合要求的节点归入节点组。这种方式能够尽可能减小资源分布波动对所求解的稳定性的影响,缺点是要通过较多的调度周期才能完成锁定过程。v1.1.0的实现选择的是这种方式。以此类推,多节点锁定是指每一个调度周期内选定X(X>1)个知足条件的节点进行锁定。这种方式能必定程度上弥补单节点锁定引入的锁定时长过长问题,缺点是X不易找到最优值,实现复杂度高。集群锁定是指一次性锁定集群全部节点,直至目标做业完成调度。这种粗暴的方式实现最为简单,目标做业等待时间最短,很是适合超大目标做业的资源预留。

锁定节点已有负载的处理手段有两种:抢占式预留、非抢占式预留。顾名思义,抢占式预留将会强制驱逐锁定节点上的已有负载。这种方式能够保证最快腾出所需的资源申请量,但会对已有业务形成重大影响,所以仅适用于紧急任务的资源预留。非抢占式预留则在节点锁定后不作任何处理,等待运行在其上的负载自行结束。v1.1.0采用的是非抢占式预留。

图1 做业资源预留设计

最佳实践

基于v1.1.0的实现,社区当前仅支持目标做业的自动化识别与资源预留。为此,新引入了2个action和1个plugin。elect action用于选取目标做业;reserve action用于执行资源预留动做;reservation plugin中实现了具体的目标选取和资源预留逻辑。

若要开启资源预留特性,将以上action和plugin配置到volcano的配置文件中便可。下面是推荐配置样例:

``` yaml
actions: "enqueue, elect, allocate, backfill, reserve"
tiers:
- plugins:
  - name: priority
  - name: gang
  - name: conformance
  - name: reservation
- plugins:
  - name: drf
  - name: predicates
  - name: proportion
  - name: nodeorder
  - name: binpack
```

自行配置时,请注意如下事项:

  • elect action必须配置在enqueue action和allocate action之间
  • reserve action必须配置在allocate action以后

因为目标做业的识别、选取、资源预留都是自动化完成,整个过程在用户侧彻底透明,可经过scheduler日志查看到整个过程。

图2 做业资源预留流程图

总结展望

本文重点讲解了基于v1.1.0的目标做业资源预留特性的设计和最佳实践。讲解过程当中,全面介绍了特性设计过程当中的考量因素和算法设计。资源预留的细分场景不少,没法一一枚举。社区后续版本将持续聚焦共性预留需求,完善主要场景下资源预留特性,保证调度公平性。

本文分享自华为云社区《Volcano做业资源预留设计原理解读》,原文做者:技术火炬手。

 

点击关注,第一时间了解华为云新鲜技术~

相关文章
相关标签/搜索