【译】Stratus: cost-aware container

2022-03-29  本文已影响0人  亼珏

摘要

      Stratus是一个新的集群调度器,专门用于协调在虚拟集群上运行的batch作业,在公共的IaaS平台动态分配虚拟机实例的集合。与传统的集群调度器不同,Stratus主要致力于成本方面的考虑,因为公有云有效的提供了无限制的,高度异构的,按需分配的资源。但是由于资源在分配时是收费的,Stratus在作业运行时评估的指导下,积极地将任务打包到机器上,尽可能让任务分配的资源要么是满的要么是空的(满的可以提高利用率空的可以节约成本)。基于谷歌的集群负载追踪器和TwoSigma展示,Stratus与最先进的虚拟集群调度器相比降低了17-44%的成本。

CCS概念

术语介绍

术语 描述
Instance/Server/VM 在IaaS平台租用的一组资源,通常是虚拟机的形式(比如亚马逊的EC2)
Container 可在Instance中部署的隔离环境(比如Linux Container)
Resource 实例的硬件资源,比如虚拟化核或内存
Resource until 分配给task的实例资源聚合百分比
Task 计算的最小逻辑单元,通常在单个container中执行
Job 由集群中用户提交的运行计算任务的集合
Runtime bin 由时间间隔定义的逻辑bin,由一组Instance组成,这些instance上task的运行时小于时间间隔的上限。Stratus使用它将相似运行时的任务分配给实例。
Instance type https://www.amazonaws.cn/en/ec2/instance-types/

EC2的三种计费方式

  1. On-demand Instance 按需计费。提供以GB/小时为粒度的计费单位,无须预付费,也无须承诺使用时长,并且可以通过Auto Scaling功能自动增删所租用的资源,做到了按需支付
  2. Reserved Instance 预付费。需要事先承诺合同时长,比如一年或三年,并需要缴纳一定的一次性费用,但是此后在实际中使用仍然以小时计费,而且单价比On-demand Instance 平均低50%。在服务等级上Reserved Instance也高于On-demand Instance ,亚马逊保证Reserved Instance用户随时可以获取其所需要的服务资源,而按需的没有这种保证,不过也很少会出case
  3. Spot Instance 竞价/自定义价格。在这种服务中用户自己定价,定下愿意接受的最高价格,来租用EC2的闲散资源。亚马逊根据供需情况会周期性的发布即时价格,若用户定价高于该价格时则服务运行且以实际价格支付,若用户定价低于即时价格则系统自动终止服务待即时价格低于用户最高限价时再次启动。这种模式适合需要大量计算能力但对计算响应要求不高的用户。当然用户需要自行保证使用Spot Instance的应用对于随时宕机具有调整能力。

1 简介

      公有云计算已经成熟到很多组织都依赖它来减轻传统的本地集群(所谓的云爆发)的工作负载甚至完全取代本地集群。虽然传统的集群调度器可以管理大多数公有云虚拟机实例的静态分配,但是这种安排将无法利用公有云的弹性按需属性,所以是不必要的成本。(原文中使用实例instance这一术语来代指在公共IaaS云中租用的虚拟机资源)
      通用方法 [15,36,38,54] 都是在任务提交时分配实例在任务完成时释放实例。虽然简单但是这种为每个任务都新建一个实例的方式失去了一个重要的机会:通过将任务打包成更少虽然可能更大的实例中来降低成本。这样做可以提高资源利用率,也能够利用实例类型之间不同的价格差异。
      我们需要一个虚拟集群调度器virtual cluster (VC) scheduler,它可以像传统的调度器一样,将工作打包成instances,不需要假设正在管理一个固定的资源池。这种调度器与传统的集群调度器不同,与强迫任务等待其他任务完成的方式相比,它通过按需获取额外资源的能力,增加了资源租用成本,消除了排队延迟。最小化成本依赖于做出正确的决策,包括哪些任务可以一起打包在instances上,何时添加更多实例,添加何种实例类型,以及何时释放以前分配的实例。
      Stratus是专门为公共IaaS平台上的虚拟集群设计的调度器。Stratus会自适应的增加或缩小它所分配的实例集,精心选择成本最小利用率最高的任务集进行打包。随着时间的推移为了最大限度降低成本,Stratus努力尽可能的让提交的作业达到100%利用率或0%利用率以便可以立即交付(或停止支付)。通过积极使用我们称之为runtime binning的新方法,Stratus基于它们的预期完成时间进行分组和打包。如果做得好,这样打包的任务将完全利用一个实例 ,大约在同一时间完成,并且在利用率最低时允许释放当时空闲的实例。为了避免由于错误预测运行时间而延长低利用率实例的保留时间,Stratus会迁移仍在运行的任务来清除此类实例。
      Stratus的拓展决策也旨在利用实例类型多样性和实例定价变化(静态和动态)。当虚拟集群中需要额外的实例以立即运行提交的任务时,Stratus会请求经济高效的实例类型来满足一组预计完成时间相似的任务。我们发现要实现良好的成本节约,需要考虑将那些使用的每种资源成本都是一致的pending任务打包,如果要是先单独考虑一个再考虑另一个会导致<packing, instance-type>的组合更少并且成本更高。Stratus 共同决定要打包哪些任务以及使用何种实例类型。
      来源于亚马逊商城虚拟集群中的模拟实验,通过谷歌和TwoSigma的集群负载跟踪驱动,证明了Stratus的有效性。与最先进的没有打包的,每个任务一个虚拟机的方法相比,Stratus将总成本分别降低了25%(Google)和31%(TwoSigma)[74]。将两个最先进的虚拟集群调度器进行比较:动态虚拟集群扩展和作业打包,Stratus降低成本17%-44%。即使使用静态的实例定价,比如亚马逊的按需实例以及谷歌的计算引擎和微软的Azure,stratus也能将成本降低10-29%。Stratus的优势归因于它的每一个主要元素:运行时意识的打包,实例多样性意识和低利用率驱动的迁移。此外,我们发现组合比分开的总和还要多,如果不能一起决定打包的任务和实例类型,那么会显著的降低成本节约。
      本文主要有四个贡献:1. 它确定了一系列独特的特征,这些特征表明了一个专门用于虚拟集群的新作业调度器的角色。2. 它描述了如何使用运行时意识的打包来最大限度的减少租用实例的低利用率以及即使存在不完美的运行时预测也可以使其在生产环境中运行良好的方法。3. 它揭示了打包决策和实例类型选择之间的相互依赖性,展示了对他们进行共同决策时所带来的成本收益。4. 它介绍了一种使用新型的打包和实例获取策略的batch作业调度器(Stratus),并且通过两个大规模的真实环境的集群工作负载的跟踪驱动模拟,展示了其策略的有效性。

2 背景和相关工作

      计算机集群的作业调度有着丰富的历史,随着新系统处理更大规模和合并的工作模式,创新仍在发生[16,19,22,24,31,32,41,46,55,56]。一般来说,作业调度器是集群管理系统的资源分配决策组件,包括检测和监视集群资源,启动分配的作业执行,强制执行资源使用限制等等。用户向集群管理系统提交一个或多个任务(共同组成一个作业的单台计算机程序)的作业,通常还包含每个任务的资源请求(比如需要多少CPU和内存)。作业调度器需要决定什么时候在哪个集群的计算机上执行这个作业中的每一个任务。处于资源隔离和安全的目的,每个任务通常以某种形式的容器执行。
      Stratus是一个集群调度器,其目的是在虚拟集群中调度批处理的工作负载(比如机器学习模型,并行测试组件,以及像MapReduce和Spark这类的分布式ETL)。本文描述了Stratus如何通过有效利用公有云无限虚拟集群弹性,实例类型多样以及租赁价格的变动来降低成本。本节概述了共有IsaS云产品的相关方面并讨论的相关工作。

2.1 云服务提供商产品

IaaS instance types and contracts IaaS实例类型及合同。

Autoscaling of virtual clusters 虚拟集群的自动扩缩容

Assigning containerized tasks to instances 将容器化任务分配给实例

2.2 相关工作

Private cluster schedulers 私有集群调度器

Task-per-instance virtual cluster schedulers 为每个任务都创建实例的虚拟机群调度器

Packing VC schedulers 集群打包调度器

Energy-conscious scheduling 节能调度器

3 STRATUS

      stratus是一个集群调度,旨在共有云上可以实现经济高效的作业执行。Stratus将新的弹性意识的打包算法与成本意识的集群缩放器相结合,利用了实例类型的多样性以及实例价格的变动。Stratus从两个方面降低了成本:1)通过调整任务运行时使一个Instance上的所有任务都在相同时刻完成(理想情况),这样可以使实例快速的从几乎完全的利用率过渡到被释放。2)通过选择在扩容时获取哪种新的实例类型并同时对任务打包进行决策,使它可以平衡实例利用率的成本收益以及实例价格随时间变化之间的关系。本节主要介绍Stratus的设计与实现

3.1 架构

      本节介绍Stratus的架构和关键组件,并引导读者了解job在Stratus中的生命周期。Stratus充当整个运行环境中的调度组件,例如YARN或者kubernetes集群。Resource Manager(RM) (比如YARN RM/ Kubernetes master)仍然负责执行环境中的调度决策。

  1. 用户提交job请求被RM接收。job请求中包含要启动的task数量,以及每个task中的资源需求。

  2. 如果job被接纳,RM会从job中剥离出task请求并将其发送给Stratus RM Proxy。RM Proxy负责接收来自RM的事件状态(比如新的任务请求,任务失败,任务完成等等)然后会将其路由到调度器。

  3. 调度器包含packer和scaler。packer决定tasks被调度到哪些可用的Instance上。scaler决定应该何时为集群获取哪些VM instances,以及何时执行任务迁移以处理任务运行时的错误校准。来自RM Proxy的任务请求,packer会将其放置到调度队列中。Pending任务会在周期性调度事件中被批量调度,调度事件的频率是可配置的。

  4. packer和scaler做调度决策和缩放决策时依赖Runtime Estimator所提供的任务运行时预估值。

  5. 如果task不能被调度到集群中可用的任何可用instance上,packer将这些任务及它们的运行时估计值一起转发给scaler,scaler会决定为这些tasks获取instance。scaler将相应的请求发送给Cloud Connector,Cloud Connector是云提供商的特定可插拔模块,用于为Stratus从中获取和中止instance。

  6. Cloud Connector翻译请求并异步通知IaaS云平台API来获取新的instance。当新的instances准备好后Cloud Connector会通过异步回调通知packer。

  7. 调度器会通知RM关于任务的放置决定,新实例的可用性,以及在调度事件结束后要迁移的任务。

  8. RM会强制执行任务的放置策略并将新实例添加到实例管理器的队列中。

  9. 在task被放到instance之后,完成事件会被提交到RM。在RM接收到job中所有task的完成事件后job就被认为已完成,并且它的任务运行时会报告给Runtime Estimator用于更新job的运行历史。

3.2 Packer

      本节介绍Stratus的在线打包组件Packer,它将新到达的tasks放置到已经运行的实例上。Scaler会使用兼容的方案,基于无法打包到运行实例的tasks的打包属性来决定获取哪些新的实例。

3.2.1 Setup

      Stratus的主要目标是最大限度的减少VC的云计算账单,账单主要由完成工作负载所需的资源时间(eg:VCore-hours)所驱动。因此,Packer的目标是紧密打包任务,使实例上运行的任务的剩余运行时尽可能彼此紧密对其,否则如果一些任务比其他完成的快,那么市里的一些容量就会被浪费。

Packer input

  1. Queue of pending task requests. pending任务的请求队列,其中每个任务的请求包含任务的资源向量(虚拟化核和内存),估计的运行时,优先级以及调度约束
  2. Set of available instances. 一组可用的实例集合,对于每个实例,Status会追踪其上的可用资源以及分配于其上的任务的剩余运行时(也就是完成任务所需的时间)

Runtime binning

3.2.2 Algorithm description

      在调度事件开始时packer组织任务和实例进入合适的bin中。然后任务按运行时降序排列-longest task first。对于每个任务,packer尝试分为两步将其分配给可用实例:up-packing 和 down-packing。

Up-packing phase

该示例展示了运行时装箱是如何随着时间的推移将任务调度到一个实例上的(图a-c)。这个简单的示例架设了所有的任务都是大小一致的并且该实例总共可以容纳四个任务。实心灰色框概述了该实例,运行时bin使用了彩色的编码(比如蓝色和红色分别代表了[16, 32)和[8, 16))。实例中的条形图表示分配给它的任务,任务条使用其bin的颜色进行编码。虚线框表示了实例分配的运行时bin。

Down-packing phase

3.3 Scaler

      当Stratus没有足够的实例来容纳调度事件中的所有任务时,它会立刻扩容(scale out)并请求新的实例提供给未被调度的任务。Stratus决定获取哪些实例的程序是迭代的。它在每次迭代结束时会决定获取一个新的实例,将未被调度的任务分配给该实例,并持续执行直到所有的未被调度的任务都被分配到某个新实例上。
      在scale-out期间,Stratus会一起考虑任务打包和实例类型的选择,寻求实现最具有成本效益的组合。在每一次迭代中,它会根据运行时降序的考虑每个bin中的为被调度的任务。scaler构造了几个候选任务组,将它们放置在新的实例上。每个候选任务组都会为每个可能的实例类型分配一个成本效益分数cost-efficiency score。具有最高成本效益分数的候选组将会被分配到其最佳得分的实例类型,该实例类型被获取并添加到虚拟集群中。
      同时考虑两者对于实现高成本效益至关重要。单独的执行任何一个,然后再执行另一项,都会导致较大的偏差。先选择实例类型会导致所选实例的利用率较低,因为packing的配合度较差;若先进行任务打包则会由于限制了合理的实例大小阻止了利用价格动态变化的机会。Stratus的迭代方法平衡了在组合空间中潜在的大规模搜索的复杂性和探索该空间中不同点的重要性。

Candidate task groups 候选任务组

Cost-efficiency score 成本效益分数

Scaling in 缩容

Runtime interval bin selection 运行时间隔bin选择器

Bidding strategy and instance revocations 投标策略与实例撤销

3.4 Runtime estimates

Runtime Estimator 运行时估计器

Handling runtime misestimates 处理运行时估计错误
      运行时估计的准确性在Stratus的打包算法中起着重要的作用。虽然Stratus使用指数大小的运行时bin可以容忍一定程度的运行时估计错误,但是引入更专业的方法来处理更大的估计错误是有益的。Stratus使用两种启发式方法来减轻任务运行时错误对成本的影响:

  1. Task runtime readjustment. 任务运行时重新调整。在对任务运行时的估计值下限进行调整时,Harchol-Balter等人观察到[26],一个运行了T秒的进程至少在持续T秒的概率约为1/2。因此Stratus通过假设任务已经运行了它运行时一半的时间来重新调整任务运行时的估计值下限。
  2. Instance clearing. 实例清除。Stratus将那些连续经历低资源利用率的实例中的任务迁移走(在我们的实验中连续意味着在一分钟超过三个调度事件),因为任务运行时不同规模的错误对齐,所以可以在不丢失任务进程的情况下安全中止。我们定义在每个维度中的资源利用率低于50%的实例为低资源利用率实例,因为通常情况下,都可以根据VM的CSP大小将一个实例上的所有任务迁移到一个更小实例上。

VM候选者根据每种资源的成本降序排序来进行评估是否清除。对于每个VM候选者,其实例上的任务要么全部迁移,要么全部不迁移,因为如果一个实例只进行了一部分迁移,那么它的利用率就会降低,但是用户仍然需要支付相同的费用来保持实例的运行;因此,每当选择一个要迁移的实例时,都会将其放到黑名单上防止其他新的任务被调度在上面。对于每个VM候选者上的任务,Stratus尝试使用3.2节中的算法将任务重新打包到当前正在运行的实例上。如果没有找到合适的实例,Stratus可能会选择获取一个新的可能更小/更便宜的实例用于放置候选者上的全部任务。Stratus在执行任务迁移之前会计算清除实例的利弊。Stratus只有在实例中任务的最长预测运行时大于估计的迁移时间时才会清除实例。

上一篇 下一篇

猜你喜欢

热点阅读