一种云计算方法
技术领域
本发明涉及云计算技术领域,尤其涉及一种基于Erlang虚拟机和Linux容器技术的云计算方法。
背景技术
CGroup技术是Control Groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如cpu内存I/O等等)的机制。CGroup技术不是全新创造的,它将进程管理从cpuset中剥离出来,CGroup也是Linux容器(LXC)为实现虚拟化所使用的资源管理手段。CGroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为CGroup子系统或控制器。CGroup子系统有控制内存的Memory控制器、控制进程调度的CPU控制器等。运行中的内核可以使用的CGroup子系统由代码.../proc/cgroup来确认。
任务(task):CGroup的术语中,任务就表示系统的一个进程。
控制组(cgroup):CGroup中的资源控制都以控制组为单位实现。控制组表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个控制组,也可以从某个控制组迁移到另外一个控制组。
子系统(subsystem):CGroup中的子系统就是一个资源调度控制器(ResourceController)。比如CPU子系统可以控制CPU时间分配,内存子系统可以限制cgroup内存使用量。
层级(hierarchy):层级由一系列控制组以一个树状结构排列而成,每个层级通过绑定对应的子系统进行资源调度。层级中的控制组节点可以包含零或多个子节点,子节点继承父节点的属性。整个系统可以有多个层级。
Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。Erlang是运行于虚拟机的解释性语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多重范型编程语言,涵盖函数式、并发式及分布式。
Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适合于构建分布式,实时软并行计算系统。使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅只是一两个环节,比起C程序的线程切换要高效得多。使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。Erlang运行时环境是一个虚拟机,代码一经编译,同样可以随处运行。它在运行时系统甚至允许代码在不被中断的情况下更新。另外如果需要更高效的话,字节代码也可以编译成本地代码运行。因此,Erlang虚拟机本身就具有Erlang编程语言的优点。
云计算通过分散计算资源的集中部署,能有效降低IT成本并提升IT服务质量,已得到广泛的认可和应用。目前大多数IaaS层云计算技术(包括Openstack、Xen、Vmware)都主要基于虚拟机技术,在追求灵活性的过程中损失了一部分计算性能。而且现有技术中的云计算平台对计算机物理资源的分配方法相对复杂。所以,如何构建一个充分利用资源,使计算能力高效的云计算平台是一个亟待解决的问题。
发明内容
为解决上述技术问题,本发明提出了一种基于Erlang虚拟机和Linux容器技术的云计算方法,以实现云计算平台计算能力的高效性。
为此,本发明采用如下技术方案:
一方面,本发明提供了一种云计算方法,所述方法包括下述步骤:S1:每个Linux容器系统创建一个CGroup层级,每个Erlang虚拟机进程对应一个所述CGroup层级,通过CGroup技术提供的子系统对所述CGroup层级下的每个CGroup子节点分配物理资源权重Wn;S2:将所述CGroup层级下的每个所述CGroup子节点与同一所述CGroup层级对应的Erlang虚拟机的进程调度者一对一映射,使得所述进程调度者对进程任务的调度受到对应的CGroup子节点的物理资源分配的限制;S3:修改所述Erlang虚拟机的任务迁移机制,使所述进程调度者中的空闲和低负载部分得到利用,使所述进程调度者中的满载部分不分配进程任务。
进一步的,所述步骤S3包括下述子步骤:S31:所述容器系统以一定频率测量所述进程调度者可运行的最大进程数M,将所述最大进程数M乘以每个进程调度者对应的CGroup子节点的物理资源分配权重Wn,得到所述进程调度者应承担的进程任务数Tn;S32:根据所得进程任务数Tn和所述进程调度者的实时运行进程数,检查所述进程调度者的状态;当所述进程调度者所有任务运行结束时或进程调度者的实时运行进程数小于某个阈值Tx(Tx<Tn)时,所述进程调度者经由如下方式中的至少一种迁入路径,从其它进程调度者的运行队列中迁入一个或多个进程任务,包括从第一相邻的进程调度者迁入,随机从一个运行队列不为空的进程调度者迁入,随机从实时运行进程数大于某个阈值Ty(Tx<Ty<Tn)的进程调度者迁入,步骤结束;否则执行步骤S33;S33:当所述进程调度者被分配新进程时,检查被分配的所述进程调度者的实时运行进程数是否已经大于或等于它所对应承担的最大任务数Tn,如果不大于且不等于则迁入所述新进程;否则经由如下方式中的至少一种迁出路径将所述新进程迁出到其他进程调度者,包括向第二相邻的进程调度者迁出,随机向除自身之外的其它进程调度者迁出。
进一步的,所述步骤S33可重复执行,当所述第二相邻的进程调度者或随机向除自身之外的其它进程调度者的实时运行进程数仍然已经大于或等于它所对应承担的最大任务数Tn,则继续经由如下方式中的至少一种迁出路径将所述新进程迁出到其他进程调度者,包括向第二相邻的进程调度者迁出,随机向除自身之外的其它进程调度者迁出,直到找到一个实时运行进程数小于它所对应承担的最大任务数Tn的进程调度者。
进一步的,所述方法还包括下述子步骤:
S34:检查所述进程调度者的实时运行进程数是否大于某个阈值Ty,若大于则经由如下方式中的至少一种迁出路径将其运行队列中的一个或多个进程任务迁出到其他进程调度者,包括向第二相邻的进程调度者迁出,随机向除自身之外的其它进程调度者迁出;
进一步的,所述步骤S31的所述测量频率为每秒钟4次。
进一步的,所述步骤S2是通过开启与所述CGroup层级下的所述CGroup子节点个数相同的进程调度者数量的方式,以实现所述CGroup子节点与所述进程调度者一对一映射。
进一步的,所述步骤S32中的所述第一相邻为进程调度者序列中的前一个。
进一步的,所述步骤S33中的所述第二相邻为进程调度者序列中的后一个。
另一方面,本发明提供了一种云计算系统,其特征在于,包括存储器,存放有程序;处理器,运行所述程序,以执行如上述所述的方法。
再一方面,本发明提供了一种包含计算机程序的计算机可读存储介质,所述计算机程序可操作来使计算机执行如上述所述的方法。
本发明的有益效果是:本发明的技术方案将Linux容器的CGroup技术构建在对称多处理器(Symmetric Multi-Processor,SMP)结构的物理计算资源上,因为相对于通过虚拟机监视器(Hypervisor)创建一个完整的操作系统,Linux容器利用Linux的CGroup机制对进程做了CPU、内存和网络方面的隔离,直接使用原生资源,没有额外的操作系统开销,所以计算机物理资源利用率高,比通过虚拟机监视器的计算效率高。并且充分基于Erlang/OTP13B版本之后对SMP计算机结构的支持,使Erlang虚拟机的任务调度和均衡机制与LinuxCGroup的资源隔离机制进行映射,每个系统进程可以支持1至1024个进程调度者(Scheduler),且每个Scheduler拥有自己的运行队列(Run Queue),使得当Scheduler增加时不会彼此阻塞,充分利用了计算机物理资源,保证了高并发计算能力。在进程调度者和计算物理资源映射的基础上,进一步修改并优化了任务迁移机制(Migration Logic),使任务分配具体到运行队列级别,进而在多个运行队列中高效而均衡的运行。因此,本发明的技术方案具备计算能力的高效性。
附图说明
图1是本发明的云计算方法的流程图;
图2是本发明所涉及的基于Erlang虚拟机和CGroup技术的云计算方法的结构图;
图3是本发明所涉及的Linux容器中每个CGroup节点的资源分配权重示意图;
图4是本发明所涉及的Linux容器中每个CGroup节点与Erlang虚拟机中的每个进程调度者的映射图;
图5是本发明的云计算方法中步骤S3的子流程图;
图6是本发明所涉及的Linux容器中Erlang进程调度与CGroup资源调度映射的原理示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示是本实施例提供的一种云计算方法的流程图,为了便于说明,仅示出了与本发明实施例相关的部分,详述如下:
S1:每个Linux容器系统创建一个CGroup层级,每个Erlang虚拟机进程对应一个所述CGroup层级,通过CGroup技术提供的子系统对所述CGroup层级下的每个CGroup子节点分配物理资源权重Wn;
本实施例的计算容器是基于Linux内核版本2.6.29及其以上版本,和Erlang的R13B以上版本构建,在Linux内核源码基础上,基于CGroup系统实现。如图2所示,因为Linux内核(Linux Kernel)已经集成了CGroup管理系统,所以由Linux Kernel直接管理多个Erlang虚拟机(Erlang VM)进程,这些Erlang虚拟机进程伪装成HOST进程共存,每个虚拟机共用底层硬件部分,但是每个虚拟机有单独的操作系统,虚拟机之间又互相隔离进程和资源。这样由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求的方式就称为容器。可以通过在容器配置一次开发环境,然后通过复制容器,形成多个虚拟机;也可以在多个容器中分别配置开发环境,形成多个虚拟机。在每个容器创建一个CGroup层级,这样每个Erlang虚拟机进程就对应一个CGroup层级。CGroup子系统是物理资源控制器,主要是通过cpuset子系统管理cpu资源,memory子系统管理内存资源和blkio子系统管理输入/输出资源。在一个容器中,这些cpuset,memory子系统可以挂载到一个目录下,但是当cpuset子系统已经被挂载过一次之后,就不能再挂载到另外一个目录。如图3所示,在/cpu_mem_cg目录下是挂载了cpuset的子系统,在CGroup层级下有cg1,cg2,…,cgN,N个子节点,根据用户的实际需要对每个CGroup子节点分配cpu使用权重Wn,即总cpu资源的使用占比,例如,为cg1分配20%的cpu资源。当需要对每个CGroup子节点分配内存使用权重时,只需要将memory子系统附加到该容器的CGroup层级上即可。
S2:将所述CGroup层级下的每个所述CGroup子节点与同一所述CGroup层级对应的Erlang虚拟机的进程调度者一对一映射,使得所述进程调度者对进程任务的调度受到对应的CGroup子节点的物理资源分配的限制;
启动该容器中的Erlang虚拟机,在Erlang虚拟机启动与CGroup层级下的CGroup子节点个数相同的进程调度者,使进程调度者和CGroup子节点一对一映射,如图4所示。这就使得存在于每个CGroup子节点中的任务(task)与Erlang虚拟机中的进程调度者所拥有的运行队列(Run Queue)映射起来,从而进程调度者对进程任务的调度受到对应的CGroup子节点的物理资源分配的限制。
S3:修改所述Erlang虚拟机的任务迁移机制,使所述进程调度者中的空闲和低负载部分得到利用,使所述进程调度者中的满载部分不分配进程任务。
Erlang虚拟机在R13B版本之后对对称多处理器(SMP)计算机架构做了很好的支持,从过去的多个进程调度者(Scheduler)共享一个运行队列(Run Queue)的方式改变为每个进程调度者拥有独立的运行队列,这样可以通过利用多核处理器对任务的分担,极大减少了由于锁冲突造成的系统性能下降。并且针对多个运行队列,Erlang虚拟机还自身存在一种任务迁移机制,作用是从系统中收集的统计数据,控制和平衡运行队列。但是由于进程任务调度现在还受到物理资源分配的限制,需要对任务迁移机制进行修改以满足限制的要求。
进一步的,步骤S3还包括下述子步骤,如图5所示:
S31:所述容器系统以一定频率测量所述进程调度者可运行的最大进程数M,将所述最大进程数M乘以每个进程调度者对应的CGroup子节点的物理资源分配权重Wn,得到所述进程调度者应承担的进程任务数Tn;
作为一种可选的实施方式,容器系统以每秒钟4次实时测量Erlang虚拟机下所有开启的进程调度者可运行的最大进程数M,由于步骤S2中进程调度者和CGroup子节点一对一映射关系,每个CGroup子节点又分配了物理资源分配权重Wn,所以可通过计算M*Wn=Tn,得到每个进程调度者能够在有限物理资源下应承担的进程任务数Tn。
S32:根据所得进程任务数Tn和所述进程调度者的实时运行进程数,检查所述进程调度者的状态;当所述进程调度者所有任务运行结束时或进程调度者的实时运行进程数小于某个阈值Tx(Tx<Tn)时,所述进程调度者经由如下方式中的至少一种迁入路径,从其它进程调度者的运行队列中迁入一个或多个进程任务,包括从第一相邻的进程调度者迁入,随机从一个运行队列不为空的进程调度者迁入,随机从实时运行进程数大于某个阈值Ty(Tx<Ty<Tn)的进程调度者迁入,步骤结束;否则执行步骤S33;
进程调度者会出现它所对应的运行队列中所有任务都结束时即空闲状态,也会出现所对应的运行队列中的实际运行进程数小于某个阈值Tx(Tx<Tn)时即低负载状态。当某个进程调度者处于空闲或低负载状态时,为了使计算容器整体高效运行起来,用编程方式控制空闲或低负载的进程调度者主动迁入任务,放进其所对应的运行队列之中。因为计算机在对进程调度者进行调度时是按顺序调用,排在前面的进程调度者会先被分配任务,所以在某个进程调度者需要迁入任务时,也会优先选择进程调度者序列中的前一个进程调度者。或者是通过随机找到一个运行队列不为空的进程调度者迁入。还可以从实时运行进程数大于某个阈值Ty(Tx<Ty<Tn)的进程调度者迁入,作用是使高负载的进程调度者的进程任务可以流向空闲和低负载的进程调度者。
S33:当所述进程调度者被分配新进程时,检查被分配的所述进程调度者的实时运行进程数是否已经大于或等于它所对应承担的最大任务数Tn,如果不大于且不等于则迁入所述新进程;否则经由如下方式中的至少一种迁出路径将所述新进程迁出到其他进程调度者,包括向第二相邻的进程调度者迁出,随机向除自身之外的其它进程调度者迁出。
当某个进程人为的需要更多物理资源运行或其他情况,计算机在将该进程分配个某个进程调度者时,不会先考虑进程调度者的状态。因此当某个进程调度者被分配新进程时,需要先检查被分配的进程调度者的实时运行进程数是否已经大于或等于它所对应承担的最大任务数Tn,如果不大于且不等于则迁入新进程;否则就需要将该新进程迁出到其他进程调度者。同样由于计算机在对进程调度者进行调度时是按顺序调用,排在后面的进程调度者往往会未被分配任务或分配少量任务,所以在某个进程调度者需要迁出任务时,也会优先选择进程调度者序列中的后一个进程调度者。或者是通过随机找到一个除自身之外的其它进程调度者迁出。作为一种可选的实施方式,步骤S33可重复执行,当被找到的进程调度者需要迁入该进程时,对于该进程调度者同样是一个被分配新进程的过程。因此会再次检测被找到的进程调度者即第二相邻的进程调度者或随机向除自身之外的其它进程调度者中,实时运行进程数是否已经大于或等于它所对应承担的最大任务数Tn,如果不大于且不等于则迁入所述新进程;否则继续经由如下方式中的至少一种迁出路径将所述新进程迁出到其他进程调度者,包括向第二相邻的进程调度者迁出,随机向除自身之外的其它进程调度者迁出,直到找到一个实时运行进程数小于它所对应承担的最大任务数Tn的进程调度者。
进一步的,所述方法还包括下述子步骤:
S34:检查所述进程调度者的实时运行进程数是否大于某个阈值Ty,若大于则经由如下方式中的至少一种迁出路径将其运行队列中的一个或多个进程任务迁出到其他进程调度者,包括向第二相邻的进程调度者迁出,随机向除自身之外的其它进程调度者迁出;
该步骤是使计算机可以主动检测进程调度者是否处于高负载状态即实时运行进程数是否大于某个阈值Ty,当处于高负载时主动迁出任务。迁出路径同样采用向第二相邻的进程调度者迁出,或者是通过随机找到一个除自身之外的其它进程调度者迁出。作为一种可选的实施方式,当步骤S33中进程调度者被分配新进程时,检查到被分配的所述进程调度者的实时运行进程数不大于且不等于它所对应承担的最大任务数Tn后,还要继续执行步骤S34,检查被分配的进程调度者的实时运行进程数是否大于某个阈值Ty,如果不大于才迁入该新进程。如果大于阈值Ty,则继续执行步骤S33。因此步骤S32、S33和S34的作用是使计算容器中每个CGroup子节点下的多个进程任务(tasks)可以和每个进程调度者中的运行队列映射起来,如图6所示,使得每个进程任务可以具体分配到某个空闲或任务进程数少的运行队列中,使进程任务更加高效而均衡地执行。
以上内容是结合具体/优选的实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,其还可以对这些已描述的实施方式做出若干替代或变型,而这些替代或变型方式都应当视为属于本发明的保护范围。