Dominant Resource Fairness: Fair Allocation of Multiple Resource Types

来源:互联网 发布:可惜不是你网络短剧 编辑:程序博客网 时间:2024/06/06 19:23

论文的大致内容:
在一个拥有多资源系统中往往需要面对资源平均分配的问题,每个用户对每个资源都有不同的需求。针对这个问题,伯克利几位大牛Ali Ghodsi, Matei Zaharia, Benjamin Hindman, Andy Konwinski, Scott Shenker, Ion Stoica发表了一篇文章,提出Dominant Resoruce Fairness(DRF)算法,一个多资源分配的max-min fariness算法。DRF不同于其他策略,他拥有几个很重要的特性:
1. DRF刺激用户共享资源,保证在均分资源后没有用户能够获得更多的资源
2. DRF是strategy-proof的,表示的意思是一个用户不能通过欺骗他的真实需求来提高自身的分配额度
3. DRF是envy-free的,表示的意思是没有用户愿意与其他用户交易他的分配额
4. DRF是Pareto efficient的,因为通过降低其他用户的分配来提高某一用户的份额

Introduction
资源分配是任何共享资源的计算系统的重要组件,目前最流行的分配策略是Max-min fairness,它最大化了系统中用户最小分配量,假设每个用户有足够的需求,这个策略给每个用户一个相等资源份额。 Max-min fairness 方法现已被拓展成带有权值的增强形式。
带有权值的Max-min fairness可以支持多种资源分配策略,比如基于优先级,保留和deadline的方法。除此以外,带权值得Max-min fairness能够保值隔离性,因为用户能够被确保收到她应得的资源而不管其他用户的需求。
尽管在公平分配领域已经有很多的工作,但是焦点一直都放在了单一资源类型。尽管在拥有多资源的环境下,用户拥异构的资源需求,分配也是使用了单一资源抽象进行的。比如Haddop,Dryad的公平调度器,这两个广泛使用的集群计算框架,都是根据fixed-size划分资源进行分配,并称每个划分为一个slot。这种方法忽略了在集群中,不同的任务其实具有完全不同的CPU,内存和I/O资源的需求。

这篇文章主要解决了多资源异构需求的多用户资源分配,具体的讲,提出了Dominant Resource Fairness方法,DRF方法的设想是在多资源的环境中,用户被分配的量应该由其dominant share来决定,dominant share是该用户被分配的任何资源中最大的份额。一句话来说就是DRF目的是在所有用户中,寻求最小份额的最大值。比如说,如果用户A启动了CPU密集型任务,用户B启动了内存密集型任务,DRF尝试均等用户A的CPU份额和用户的内存份额。在单一资源的场景下,DRF退化成max-min fairness方法。

DRF的长处主要是它满足的众多属性引人入胜,这些属性在max-min fairness下的单一资源环境下很容易被满足,但是在多资源情况下并不是那么容易。这些属性分别是:sharing incentive,strategy-proofness, Pareto efficiency, and envy-freeness.

Motivation
正如前面说的,之前在带有权值的max-min fairness工作中,主要聚焦于单一的资源,然而现在云计算和多核处理器都进步的很快,用户的多资源异构需求也在上升。 多资源这里指的是多种不同的资源类型而不是多个可以相互替代的资源实例。

图1展示了Facebook的2000个节点的Hadoop集群一个月内的数据(2010年十月)
这里写图片描述
每个圆圈都表示任务的内存和cpu消耗,圆圈的大小与在这个位置的任务数量成对数关系。尽管大量的任务都是CPU密集型的,仍然存在一部分任务是内存密集型的,尤其是在reduce环节。
3. Allocation Properties
为了阐述问题,假设一个系统拥有9个cpu,18GB内存,两个用户A和B,用户A运行的每个任务需要< 1 cpu, 4GB >,B用户运行的每个任务需要< 3cpus, 1GB >。那么一个公平的分配方案会是什么样的?
一种可能是对每种资源都均分个每个用户,另外一种方式是把cpu和内存看做一个整体,然后平均分配(CPU+内存)。尽管这种拍脑子想的方案很容易得到,但是仍然不清楚如何去比较评估这些分配方案。

为了应对这样的挑战,我们定义了一组我们认为任何资源分配方案都想要的目的,由这组目标属性来引领我们构造公平的分配策略。 我们认为以下四个属性很重要:
(1) Sharing incentive: 每个用户都应该共享这个进群,而不是排他式的独占他得那部分集群。 设想一个集群拥有n个用户,那么用户能够至多分得1/n的所有资源,而不能够分配更多的任务。(不知道这个对不对啊,这样不是资源利用率不高么)
(2) Strategy-proofness: 用户不应该能能够通过谎报他的资源需求来获得更过的资源
(3) Envy-freeness: 用户不会嫉妒别的人的资源分配,这个属性意味着公平
(4) Pareto efficiency: 不可能在通过减少其他用户资源的分配的情况下提高某一个用户的资源分配量.
可以很容易的知道,max-min fairness在一种资源的情况下,满足上述所有的属性。然而,在多资源,异构的用户需求的情况下下,并不容易(not trivial).
除了上述属性,我们认为以下几个属性最好拥有:
(1) Single resource fairness: 对单一资源来说,方案应该规约到max-min fairness
(2) Bottleneck fairness: 如果有一个资源大家都是最需要,该方案也要规约到max-min fairness
(3) Population monotonicity: 如果有用户离开了系统并释放了她的资源,那么其余的用户的分配资源不能有减少
(4) Resource monotonicity: 如果更多的资源被加入了系统,任何的用户的资源不会减少
4. Dominant Resource Fairness(DRF)
对每个用户,DRF计算每种资源的份额,一个用户的最大份额被称为dominant share,相对应的资源叫dominant resource. 不同的用户可能拥有不同的dominant resource. 比如,一个用户的计算密集任务的dominant share是CPU,一个用户的I/O密集型的任务的dominant share是带宽。DRF简单的在用户的dominant share上应用了max-min fairness。 也就是说,DRF目标是最大化系统中的最小的dominant share,然后是第二小,依此类推。

这一节中,我们考虑一个计算模型拥有n个用户和m种资源,每个用户运行独立的任务,每个任务都是由demand vector来刻画,比如< 1CPU, 4GB >. 一般的,任务通常有不同的demands,即使是隶属于同样的用户。

4.1 一个例子
考虑一个系统有9CPUS,18GB RAM,两个用户A和B,用户A运行的每个任务需要< 1 cpu, 4GB >,B用户运行的每个任务需要< 3cpus, 1GB >。
在上述场景中,每个用户A的任务都消耗1/9的总CPU,2/9的总内存,所以用户A的dominant resource是内存,每个用户B的任务都消耗1/3的总CPU,1/18的总内存。所以用户B的dominant resource是CPU。 DRF将会均等化用户的dominant share,如图所示:
这里写图片描述
用户A有三个任务, < 3 CPUs, 12 GB >, 两个任务给用户B, < 6 CPUs, 2 GB >, 通过这样的分配,每用户最终将会得到相同的dominant share, 比如,用户A得到2/3的内存,用户B得到2/3的CPU。

这个分配方案可以如下列方式计算得到:
这里写图片描述
令x和y分别代表DRF分配给用户A和B的任务数,那么用户A得到< x CPU, 4x GB >,用户B得到< 3y CPU, y GB>。 总的被分配的资源是(x + 3y)CPUs 和 (4x+y) GB, 那么用户A和B的dominant share为4x/18=2x/9和3y/9=y/3. 解决这个问题得到x=3,y=2. 那么用户A最后得到< 3CPU, 12GB >,B得到< 6CPU, 2GB >.

注意DRF并不是总的需要均等每个用户的dominant shares。当一个用户的总的需求得到后,用户将不需要更多的任务,所以额外的资源可以那么分配给其他用户,像max-min fairness一样。除此以外,如果一个资源被用完了,那么那些不需要这个资源的用户仍可继续收到更高的其他资源的份额。

4.2 DRF 调度算法
这里写图片描述
Algorithm 1 显示了DRF调度的伪代码。这个算法跟踪了分配给用户的总的资源和用户的dominant share,si. 在每一步,DRF选择一个用户,这个用户她拥有最小的dominant share. 如果用户的任务需求能够被满足,比如系统拥有足够的资源满足她,那么她的任务能够被启动。 我们考虑一个一般的情况,一个用户可以启动不同资源需求的任务,我们使用Di来表示用户i的下一个想启动的任务的需求向量,为了简单起见,伪代码并没有包括任务完成的事件信息。这个例子中,用户释放任务的资源,然后DRF重新选择拥有最小dominant share的用户,来启动她的任务。

考虑4.1中两个用户的例子,表1阐述了DRF对这个例子的分配过程。
这里写图片描述
DRF首先选择B来启动任务,结果是,B的份额成为< 3/9, 1/18 >,然后dominant share成为max(3/9,1/18)=1/3,下一步,DRF选择A,因为她的dominant share是0,这个过程反复反复直到不可能启动新的任务。这个例子中,是最后CPU饱和了。

最后,用户A得到< 3CPU, 12GB >,用户B得到< 6CPU, 2GB >,每个用户得到了2/3的dominant share. 注意这个例子中只要资源被耗尽了,分配就结束了。然而,在一般情况中,在有些任务不需要获取耗尽资源的情况下,仍然能够启动新的任务。

以上的算法可以用二叉堆来存储每个用户的dominant share, 每个调度决策使用O(logn)时间复杂度。

4.3 带有权值的DRF
在实际中,均分所有的资源给所有的用户并不是是我们的目的,相反,我们希望给运行更重要任务的用户分配更多的资源,或者给集群贡献更多资源的用户更多的资源。为了实现这样的目的,我们提出带有权值的DRF,一个更一般的DRF和加权max-min fairness。

在带有权值的DRF中,每个用户i的权值来自于Wi=< wi,1,….,wi,m >,其中wi,j表示用户i对资源j的权值。那么用户i的dominant share的定义变成了si=maxj{ui,j/wi,j},其中ui,j表示用户i的资源j的份额,一个具体的情况是当么个用户i的权值相等时,比如wi,j=wi(1<=j<=m).在这种情况下用户i,j的dominant share的比率会是wi/wj. 如果每个用户的权值都是1,带有权值的DRF会回到常规的DRF.

  1. Alternative Fair Allocation Policies
    在一个多资源环境中定义一个公平的分配方案是一件不容易的事情,因为“公平”如何来定义本身就是个开放的问题。DRF是目前为唯一一个满足第三节提到的四种属性,这一节中,我们考虑另外两种替代方案,分别叫Asset Fairness,一个简单的直观的将资源看做整体均分给用户的策略,和Competitive Equilibrium from Equal Incomes(CEEI),在微观经济学领域中均匀分配资源的方法,我们在5.3节进行了对DRF的比较。

5.1 Asset Fairness
Asset Fairness 目标是把资源看做整体,均匀分配给所有用户,具体的来说,Asset Fairness计算每个用户i的聚集份额xi=Sumjsi,j,其中si,j表示资源j分配给i的份额,然后在所有的用户中应用max-min方法。比如它重复为拥有最小聚集份额的用户启动任务。

考虑4.1中的例子,既然内存的数量是CPU的两倍(9CPUs,18 GB RAM),一个CPU值两个GB的内存,假设一个GB的内存值1美元,一个CPU值2美元,那么用户A需要花6美元启动一个任务,用户B是7美元,假设x,y分别代表用户A,B的启动任务数量,那么在asset fair分配中得到以下的优化问题:

这里写图片描述
解得x=2.52,y=2.16,那么也就是说用户A得到(2.5CPU, 10.1GB),用户B得到(6.5CPU,2.2GB)。

这个分配方法有缺点:它违背了sharing incentive 属性。我们将在6.1节中看到asset fairness方法会导致一个用户得到少于1/n的所有资源,n为用户的数量。

5.2 Competitive Equilibrium from Equal Incomes
在微观经济学领域,均匀分配资源的方法通常采用 Competitive Equilibrium from Equal Incomes (CEEI) ,通过CEEI,每个用户初始得到每个资源的1/n部分,然后每个用户在这一个竞争市场里头对他的资源进行交易。最终CEEI的结果是envy-free和Pareto efficient。

更具体的说,CEEI方案实际上来自于Nash bargaining solution,Nash Bargaining Solution挑选能够最大化productiui(ai),其中ui(ai)是用户i在其分配方案中得到的效用值,为了简化比较,我们假设一个用户从他的分配方案中得到的效用值是他的dominant share si.

重新考虑4.1节中两个用户的例子,用户A的dominant share是4x/18=2x/9,用户B的dominant share是3y/9=y/3,最大化dominant share之积,与最大化x*y是一个性质的,于是CEEI着力于解决如下的问题:

这里写图片描述
解得x=45/11,y=18/11,于是用户A得到(4.1CPU, 16.4GB),用户B得到(4.9CPU,1.6GB)。

遗憾的是,CEEI尽管是envy-free和Pareto efficient,但是他不满足strategy-proof, 我们将会在6.1.2中指出用户能够通过谎报他们的资源需求得到资源分配。

5.3 Comparison with DRF
这里写图片描述
DRF能够均分dominant share,即用户A的内存份额,用户B的CPU份额,相反,Asset Fairness均等总的资源占比,如图中每个用户的矩形框,最后,CEEI假设了一个绝对竞争的市场,能够找到一个能够达成市场清算的方案,也就意味着每个资源都能被分配。遗憾的是,这种方式使得欺骗CEEI成为可能:一个用户可以声称她需要更多的未充分使用的资源,即使她并不需要,这就导致了CEEI给了她更多的任务以完成市场清算。

  1. Analysis
    6.1 Fairness Properties
    这里写图片描述
    表2总结了Asset Fairness,CEEI和DRF满足的公平性属性,本节我们将通过例子展示Asset Fairness和CEEI缺少哪些属性,同样的,我们也证实没有任何策略能够保证资源单调性而不违背sharing incentive或者Pareto efficiency,所以DRF也缺少资源单调性。

6.1.1 Properties Violated by Asset Fairness
Asset Fairness违背了几个重要的属性:sharing incentive,bottleneck fairness, resource monotonicity.

考虑下图的场景:这里写图片描述
两个用户共享一个系统<30 ,30 >,需求向量为D1=<1,3>,D2=<1,1>,Asset Fairness将会给第一个用户分配6个任务,第二个用户12个任务,那么第一个用户会收到<6, 18>资源,第二个用户收到<12,12>,尽管每个用户收到聚集份额为24/60,但是第二个用户仅仅得到了每个资源的少于一半的资源,这样违背了sharing incentive属性。

考虑另外一个场景,总资源是<21,21>,两个用户的需求向量为<3,2>,<4,1>会导致资源1是瓶颈资源。 Asset Fairness将会给每个用户三个任务,是他们的聚集都是15,然而,这将会仅仅给第一个用户3/7的资源1。

考虑两个用户的需求是<4,2>,<1,1>在一个两资源都是77个单元的系统里,Asset Fairness将会给第一个用户分配<44,22>,第二个用户<33,33>,来使得他们的总额度是66/77,如果资源二变成了双倍,Asset Fairness会减少第一个用户的分配为<42,21>,增加第二个用户为<35,35>,使他们的份额为42/77+21/154=35/77+35/154=105/154. 这样的话,就违背了资源单调性属性。

6.1.2 Properties Violated by CEEI

这里写图片描述

从这个图中,我们看到,假设总的资源向量为<100,100>,两个用户的需求为<16,1>,<1,2>,这种情况下,CEEI分配给100/31,1500/31个任务给每个用户,如果用户1改变他的需求为<16,8>,CEEI会分别给用户25/6,100/3个任务,那么其实是用户1通过欺骗的形式,提高了他的任务数量。

未完,待续