发明内容
本发明的目的是解决大规模集群中资源分配时产生资源碎片的问题,本发明在Hamonic装箱模型的基础上设计了一种基于装箱模型的集群资源调度方法及装置。
为了支持多维度资源的调度,通过计算资源请求中每一维资源所占比例,使用主资源调度算法(Dominant Resource Fit,DRF)确定资源请求的主资源类型,根据不同的主资源类型及资源量的大小将资源请求划分为若干类(资源量大小在同一个范围内的资源请求归为一类),同时,根据每个服务器上满足的资源请求的种类将服务器分组(初始时刻任何服务器上都未分配任务,将所有服务器归为一组),当有资源请求到达时,根据该资源请求的类别,为其选择一个合适的服务器分配任务以满足其需求。
本发明提出一种基于装箱模型的集群资源调度方法,包括:
步骤1,获取资源请求,通过主资源调度算法计算所述资源请求中各维度资源数量占所述集群中总资源数量的比重,设置一阈值,将所述比重大于所述阈值的资源请求作为主资源请求;
步骤2,设置所述资源请求的最大值与规整化单位,将集群资源划分成若干资源区间,其中所述规整化单位作为所述资源区间的值,所述资源区间的值不大于所述资源请求的最大值;
步骤3,获取新资源请求,并获取所述新资源请求的新主资源请求,查找与所述新主资源请求相对应的所述资源区间,根据所述资源区间,将与所述新资源请求相匹配的物理节点进行分配,以完成集群资源调度。
所述基于装箱模型的集群资源调度方法,所述步骤1之前还包括:加载并解析配置文件,获取管理员的配置项值。
所述基于装箱模型的集群资源调度方法,所述资源请求与所述新资源请求包括:内存资源请求与中央处理器资源请求,并将所述内存资源请求与中央处理器资源请求进行染色。
所述基于装箱模型的集群资源调度方法,所述步骤3还包括:将所述新主资源请求与所述新资源请求中除所述新主资源请求之外的资源请求分配到同一物理节点,其中所述新主资源请求与所述新主资源请求之外的资源请求的和,不大于所述物理节点的资源总量。
所述基于装箱模型的集群资源调度方法,所述步骤3还包括:当所述物理节点中各资源所占比例相当,则优先分配到与所述物理节点中资源占比更大的资源相匹配的资源请求。
本发明还提出一种基于装箱模型的集群资源调度装置,包括:
获取主资源请求模块,用于获取资源请求,通过主资源调度算法计算所述资源请求中各维度资源数量占所述集群中总资源数量的比重,设置一阈值,将所述比重大于所述阈值的资源请求作为主资源请求;
划分资源区间模块,用于设置所述资源请求的最大值与规整化单位,将集群资源划分成若干资源区间,其中所述规整化单位作为所述资源区间的值,所述资源区间的值不大于所述资源请求的最大值;
资源调度模块,用于获取新资源请求,并获取所述新资源请求的新主资源请求,查找与所述新主资源请求相对应的所述资源区间,根据所述资源区间,将与所述新资源请求相匹配的物理节点进行分配,以完成集群资源调度。
所述基于装箱模型的集群资源调度装置,还包括初始化模块,用于加载并解析配置文件,获取管理员的配置项值。
所述基于装箱模型的集群资源调度装置,所述资源请求与所述新资源请求包括:内存资源请求与中央处理器资源请求,并将所述内存资源请求与中央处理器资源请求进行染色。
所述基于装箱模型的集群资源调度装置,所述资源调度模块还包括:将所述新主资源请求与所述新资源请求中除所述新主资源请求之外的资源请求分配到同一物理节点,其中所述新主资源请求与所述新主资源请求之外的资源请求的和,不大于所述物理节点的资源总量。
所述基于装箱模型的集群资源调度装置,所述资源调度模块还包括:当所述物理节点中各资源所占比例相当,则优先分配到与所述物理节点中资源占比更大的资源相匹配的资源请求。
由以上方案可知,本发明的优点在于:
本发明能够根据装箱模型创建一个集群资源调度模型,对集群资源进行分配和调度,减少资源碎片,进一步提高集群资源的利用率;本发明通过将请求按照资源需求计算其主资源并将服务器进行分组的方式,尽量将较大和较小资源的请求分配到一个节点上,这样可以充分利用节点的资源:对于分配了较大请求的节点,如果剩余空间足以分配小的请求,则将小的请求分配到节点上,已达到“填充”的效果,从而减少资源“碎片”,对于提高集群资源的利用率具有重要的实际意义,具有良好的市场前景和应用价值。
具体实施方式
下面结合附图和实施例详细对本发明的具体实施方式进行说明。
以下为本发明的整体流程,如下所示:
初始化,加载并解析配置文件,获取管理员的配置项值;
获取资源请求,通过主资源调度算法计算所述资源请求中各维度资源数量占所述集群中总资源数量的比重,设置一阈值,将所述比重大于所述阈值的资源请求作为主资源请求;
步骤2,设置所述资源请求的最大值与规整化单位,将集群资源划分成若干资源区间,其中所述规整化单位作为所述资源区间的值,所述资源区间的值不大于所述资源请求的最大值;
获取新资源请求,并获取所述新资源请求的新主资源请求,查找与所述新主资源请求相对应的所述资源区间,根据所述资源区间,将与所述新资源请求相匹配的物理节点进行分配,以完成集群资源调度;将所述新主资源请求与所述新资源请求中除所述新主资源请求之外的资源请求分配到同一物理节点,其中所述新主资源请求与所述新主资源请求之外的资源请求的和,不大于所述物理节点的资源总量;当所述物理节点中各资源所占比例相当,则优先分配到与所述物理节点中资源占比更大的资源相匹配的资源请求。
内存资源请求与中央处理器资源请求,并将所述内存资源请求与中央处理器资源请求进行染色。
以下为本发明一具体实施例,如下所示:
本发明所述的调度算法基于Hamonic装箱算法,将装箱的思想应用到二维资源(内存和CPU)调度,减少资源分配过程中集群中的不可分配的“资源碎片”,算法的具体实施如下,如图1所示:
步骤101,根据主资源调度算法(Dominant Resource Fit,DRF),计算资源请求中各维度资源量占总资源量的比重,将比重较大的资源作为该资源请求的主资源,其中记MEM_REQ表示内存比重较大(即内存与CPU的比值大于阈值mem_cpu_ratio,用户可自定义,可参考集群总的可用资源中内存与CPU的比例)的资源请求,记CPU_REQ表示CPU比重较大(即内存与CPU的比值小于阈值mem_cpu_ratio)的资源请求。
步骤102,设置应用程序的资源请求的最大值(MAX_MEM,MAX_CPU)和资源规整化单位(该值可对内存和CPU资源量取整),对于MEM_REQ,将内存规整化单位作为每个区间的大小,区间总的大小为(0,MAX_MEM]。设用户的资源请求经规整化后的内存容量为M1,...,Mi,...,Mk,划分为如下区间:(0,M1],...,(Mi-1,Mi],...,(Mk-1,Mk],k是内存资源量规整化后的区间个数(1<k<N,1<i<k)。若对于某个MEM_REQ,有M∈(Mi-1,Mi],则记该MEM_REQ为Mi。同理,对于CPU_REQ,将CPU规整化单位作为每个区间的大小,区间总的大小为(0,MAX_CPU]。设用户的资源请求经规整化后的CPU资源量为C1,...,Cj,...,Cm,则区间划分为(0,C1],...,(Cj-1,Cj],...,(Cm-1,Cm],m是CPU规整化后的区间个数(其中1<m<N,1<j<m)。若对于某个CPU_REQ,有C∈(Cj-1,Cj],则记该CPU_REQ为Cj.
步骤103,判断收到的资源请求的类型(MEM_REQ或CPU_REQ),并根据其主资源的资源量大小所属区间,确定该资源请求的类型Mi或Cj。在资源分配的过程中,对于收到的资源请求标记颜色,分别染为红色和蓝色。βmi和βci分别表示在一个节点可满足的蓝色Mi和蓝色Cj的最大数目,δmj和δcj表示该物理服务器中除了蓝色Mi或Cj外的剩余的资源量。
步骤104,根据物理节点上已得到满足的资源请求的类别将物理节点分组,对应分配了主资源为MEM和CPU的物理节点的分组信息如下:
(1)对应MEM_REQ的物理节点的分组情况:
a)GROUP_MEM(Mi),该分组中的物理节点上仅满足蓝色Mi。该组的物理节点只有一个处于允许分配的状态且该节点上的蓝色Mi少于βmi。该组其他物理节点上运行着的Mi数均为βmi。
b)GROUP_MEM(Mi,Mj),该组的物理节点上满足的MEM_REQ既有蓝色的Mi也有红色的Mj,即两种资源量处于不同区间的内存为主资源的资源请求。该分组中每个物理节点上可满足的蓝色的Mi的最大数目为βmi,则该节点上红色的Mj可使用的资源量为δmi。该组中至多有3种物理节点,分别是:当且仅当节点上蓝色的Mi的数目少于最大值βmi的物理节点、当且仅当节点上的红色Mj占用的总资源量少于δmi的物理节点和分配的蓝色Mi的数目少于最大值βmi且分配的红色的Mj占用的总资源量少于δmi的物理节点。
c)GROUP_MEM(Mi,Mj,Cg),该分组中的物理节点上满足3种类型的资源请求,包括:蓝色的Mi、红色的Mj和红色的Cg。该组的物理节点上可满足的蓝色的Mi的最大数目为βmi,另外可满足的两种红色资源请求的最大数量则由该节点上除了蓝色Mi外的剩余资源量决定。该组至多有2种处于可分配状态的物理节点,分别是分配的蓝色Mi的数目少于最大值βmi的节点和除了蓝色Mi占用外剩余的资源量可以分配给红色Mj或红色Cg的节点。
d)GROUP_MEM(Mi,?,?),该组的物理节点上满足的资源请求的类型未最终确定,但可以知道的是节点上当前仅分配了蓝色的Mi。该组的节点都处于可分配状态,以后可能在节点上为红色的MEM_REQ或红色的CPU_REQ分配资源。在满足了除蓝色Mi外的资源请求后更新该节点的分组为GROUP_MEM(Mi,Mj)或GROUP_MEM(Mi,Mj,Cg)。
e)GROUP_MEM(?,Mj,Cg),该组的物理节点上满足的资源请求的类型未最终确定,但可以知道的是节点上当前分配了红色的Mj或红色的Cg。该组的物理节点都处于可分配资源状态,以后可能在该节点为蓝色的MEM_REQ分配资源,为蓝色Mi分配资源后将该节点分到GROUP_MEM(Mi,Mj,Cg)。
为了使物理节点上可用资源量中的内存和CPU趋于平衡,对于混合类型(同时为红色MEM_REQ和红色CPU_REQ分配了资源)的物理节点,在分配资源时将该节点上当前可用资源中CPU(个数)与内存(GB)的比值ratio与节点资源总容量的比值ratio_initial进行比较:若ratio>ratio_initial,即当前节点可用资源中CPU资源所占比例较高,此时在该节点上为红色的CPU_REQ分配资源;若ratio≤ratio_initial,即当前节点可用资源中内存所占比例较高,则此时在该节点上为红色的MEM_REQ分配资源。
(2)分配了CPU_REQ的物理节点的分组方法与(1)类似,具体描述如下:
f)GROUP_CPU(Cj),该分组的物理节点中仅满足蓝色的Cj。该组中只有一个物理节点处于可分配状态且该节点上已满足的蓝色Cj的数目少于最大值βcj。该组其余不可分配的节点上分配的蓝色的Cj的数目均已达到最大限βcj。
g)GROUP_CPU(Cj,Ci),该分组的物理节点上既为蓝色的Cj也为红色的Ci分配资源,其中可满足的蓝色的Cj的最大数目为βcj,则该节点上可为红色的Mj分配的资源量为δcj。该分组中至多有3种处于可分配状态的物理节点,分别是:当且仅当分配的蓝色的Cj的数目少于最大值βcj的物理节点、当且仅当分配给红色的Ci使用的总资源量少于δci的物理节点以及分配的蓝色Cj的数目少于最大值βcj且分配的红色的Ci占用的总资源量少于δci的物理节点。
h)GROUP_CPU(Cj,Ci,Mg),该分组中的物理节点上满足3种类型的资源请求,分别是蓝色的Cj、红色的Ci和红色的Mg。该组的物理节点上允许分配的蓝色的Cj的最大数目为βcj,另外两种红色资源请求的最大数量则由该节点上除了蓝色的Cj外的剩余资源量决定。该组至多有2种处于可分配状态的物理节点,分别是分配的蓝色Ci的数目少于最大值βcj的节点和除了蓝色Cj占用外剩余的资源量可以分配给红色Ci或红色Mg的节点。
i)GROUP_CPU(Cj,?,?),该组的物理节点上满足的资源请求的类型未最终确定的节点,但可以知道的是节点上当前仅分配了蓝色的Cj。该组的节点都处于可分配状态,以后可能在节点上为红色的CPU_REQ或红色的MEM_REQ分配资源。在为除蓝色Cj外的资源请求分配资源后,更新该节点分组为GROUP_CPU(Cj,Ci)或GROUP_CPU(Cj,Ci,Mg)。
j)GROUP_CPU(?,Ci,Mg),该组的物理节点上满足的资源请求的类型未最终确定的节点,但可以知道的是节点上当前为红色的Ci或红色的Mg分配了资源。这些节点都处于可分配状态,以后可能为蓝色的CPU_CONTAINER分配资源,当该节点分配了蓝色的Cj后更改分组为GROUP_CPU(Cj,Ci,Mg)。
为了使物理节点上可用资源量中的内存和CPU趋于平衡,对于混合类型(即分配了红色CPU_REQ又分配了红色MEM_REQ)的物理节点,在分配资源时将该节点上当前可用资源中CPU(个数)与内存(GB)的比值ratio与节点资源总容量的比值ratio_initial进行比较:若ratio≤ratio_initial,即当前节点可用资源中内存资源所占比例较高,此时在该节点上分配红色的MEM_REQ;若ratio>ratio_initial,即当前节点可用资源中CPU所占比例较高,则此时在该节点上分配红色的CPU_REQ。
在资源分配的过程中,尽量将较大和较小资源的request分配到一个节点上,这样可以充分利用节点的资源:对于分配了较大request的节点,如果剩余空间足以分配小的request,则将小的request分配到节点上,已达到“填充”的效果,从而减少资源“碎片”。
步骤105,开始时进行一些初始化工作:加载并解析配置文件,获取管理员的配置项值,比如允许分配的单个资源请求的最大资源量限制<MAX_MEM,MAX_CPU>,限制染为红色的资源请求数量的比例值mem_red_ratio和cpu_red_ratio。初始化各个节点分组列表为空,初始化用于各个用途的几个request计数器的值为0,包括。至此初始化完毕,开始接收并处理应用程序发来的资源请求,将收到的资源请求规整化后检查其资源量分类区间mem_unit[N]和cpu_unit[N]中是否存在该值,若存在,则确定其分类区间;若不存在,则将该值作为新值存入分类区间,即新增一个分类区间,实现动态创建资源请求的分类区间。接着对于收到的资源请求request做如下处理:
(3)如果request类型为Mi,则更新Mj的总数(如图2所示);否则,转到(4)。
k)若红色Mi的数量小于Mi数量的限制比例且其Mi的资源量在允许染为红色的阈值范围内,则将request染为红色,红色Mi数量加1.否则,转到L),步骤k)包括以下步骤:
i.如果存在一个处于分配状态的组GROUP_MEM(?,Mi,Cj)的节点node,并且该节点中用于分配红色request的资源满足需求,则在节点node为request分配资源;否则,转到ii.
ii.对任意的Mj,如果存在一个处于可分配状态的组GROUP_MEM(Mj,Mi)的节点node且该节点中除了用于分配Mj的资源外的剩余资源量δmi满足request的需求,则将在节点node分配资源。否则,转到iii.
iii.如果存在处于可分配状态的组GROUP_MEM(Mi,?,?)的节点node且用于分配红色Mi的资源满足request的需求,此时,将节点当前剩余资源量的比值与节点总资源容量比进行比较:若ratio_res<ratio_initial_res,即当前节点剩余资源中内存所占比例较高,此时在该节点为request分配资源。否则,转到iv。
iv.寻找一个新的GROUP_MEM(?,Mi,?)的节点为request分配资源。
L)将request染为蓝色,即request.color=blue,包括以下步骤:
1-1.如果Mi的资源量大于mem_ratio*MAX_MEM,则执行A。否则,转到2-1;
1-1-1,如果存在一个处于可分配状态的组GROUP_MEM(Mi)的节点node中蓝色Mi数少于βmi,则在节点node上为request分配资源。否则,转到1-1-2;
1-1-2,找一个新的GROUP_MEM(Mi)的物理节点node为request分配资源;否则,转到2-1;
2-1,此时红色Mi占Mi总数的比例已达到限制,则
2-1-1,如果对于任意Mj,存在处于可分配状态的组GROUP_MEM(Mi,Mj)的节点node且node上分配的蓝色Mi数少于βmi,则节点node上为request分配资源。否则,转到2-1-2。
2-1-2,如果存在组GROUP_MEM(?,Mi,Cg)的节点node,可用资源满足request的需求,则为request分配资源,并将节点node的分组更新为组GROUP_MEM(Mi,Mi,Cg)。否则,转到2-1-3。
2-1-3,寻找一个新的组GROUP_MEM(Mi,?,?)的节点为request分配资源。
(4)如果request类型为Cj,则更新Cj类型的request的总数,包括以下步骤:
m)如果红色Cj的数量小于Cj数量的限制比例且request的资源量在允许染为红色的资源量阈值范围内值,则将Cj染为红色,红色Cj数量加1.否则,转到n);
3-1,如果存在一个处于可分配状态的组GROUP_CPU(?,Cj,Mg)的节点node,若该节点中用于分配红色request的资源满足request的需求,则将该Cj分配到此节点;否则,转到3-1-2;
3-2,对于任意的Ci,如果存在一个处于可分配状态的组GROUP_CPU(Ci,Cj)的节点且该节点中除了用于分配Ci的资源外的剩余资源满足request的需求,则将在此节点为request分配资源。否则,转到3-1-3;
3-3,如果存在处于可分配状态的组GROUP_CPU(Ci,?,?)的节点且用于分配红色request的资源满足request的需求,将该节点当前剩余资源的比值与节点总资源容量比进行比较:若ratio_res>ratio_initial_res,即当前节点剩余资源中CPU所占比例较高,此时在该节点为request分配资源。否则,转到3-4;
3-4,寻找一个新的GROUP_CPU(?,Ci,?)的节点,若找到的节点的用于分配红色request的资源足够,则为request分配资源。
n)将request染为蓝色,即request.color=blue;
4-1,如果request的资源量大于cpu_ratio*MAX_CPU,则执行A。否则转到4-2;
4-1-1,如果存在一个可分配的组GROUP_CPU(Cj)的节点node且节点中蓝色Cj数少于βcj,则在该节点为request分配资源。否则,转到B;
4-1-2,找一个新的GROUP_CPU(Cj)的节点并为request分配资源。否则,转到4-2;
4-2,此时红色Cj占Cj总数的比例已达到限制。
4-2-1,如果对于任意Ci,存在处于可分配状态的组GROUP_CPU(Cj,Ci)的节点且该节点内分配的蓝色Cj数少于βcj,则在该节点为request分配资源。否则,转到4-2-2;
4-2-2,如有组GROUP_CPU(?,Ci,Mg)的某个节点node,则在节点node上分配资源,将其分组更新为GROUP_CPU(Cj,Ci,Mg)。否则,转到4-2-3;
4-2-3,找一个新的组GROUP_CPU(Cj,?,?)的节点为request分配资源。
步骤106,每当收到一个资源请求后执行步骤5为其分配资源,并在节点上启动任务运行。