CN103294540A - 一种通过至强融核协处理器提升Erlang虚拟机性能的方法 - Google Patents
一种通过至强融核协处理器提升Erlang虚拟机性能的方法 Download PDFInfo
- Publication number
- CN103294540A CN103294540A CN2013101846287A CN201310184628A CN103294540A CN 103294540 A CN103294540 A CN 103294540A CN 2013101846287 A CN2013101846287 A CN 2013101846287A CN 201310184628 A CN201310184628 A CN 201310184628A CN 103294540 A CN103294540 A CN 103294540A
- Authority
- CN
- China
- Prior art keywords
- erlvm
- end points
- phi
- host
- erlang
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明是一种通过至强融核(Xeon PhiTM)协处理器提升Erlang虚拟机性能的方法,适用于各种基于Erlang的应用程序。在宿主机上运行Erlang虚拟机ERLVM_HOST,在至强融核协处理器卡上运行Erlang虚拟机ERLVM_PHI。在两个Erlang虚拟机之间建立了进程管理通道和消息传递通道,实现两个Erlang虚拟机之间Erlang进程的提交、迁移和消息传递,并改进了Erlang虚拟机在至强融核协处理器上的负载均衡机制。本发明方法将宿主机和至强融核协处理器两种异构的平台结合起来,提升了Erlang虚拟机的并发度和性能,使得Erlang虚拟机能够承受更大程度的吞吐量。
Description
技术领域
本发明涉及一种通过至强融核(Xeon PhiTM)协处理器提升Erlang虚拟机性能的方法,适用于提升各种利用Erlang编写的要求极高并行度的应用程序的并发度,从而提升这类应用程序的运行性能。这一类应用程序包括网络服务器程序、数据库管理程序、键值存储系统、实时消息系统和高性能计算程序等。
背景技术
Erlang是一种用于构建大型可伸缩且要求高可用性的软实时系统的语言。Erlang虚拟机是运行Erlang语言编写的程序的平台,用Erlang语言编写的应用程序被编译为字节码,然后在Erlang虚拟机上运行。在Erlang虚拟机中,运行的基本单元是轻量级Erlang进程,Erlang虚拟机实现了高效的Erlang进程创建和调度功能。Erlang进程之间不允许任何形式的共享内存,Erlang进程之间唯一的通信方式是异步的消息传递,因此相比共享内存的多线程模型,Erlang的进程模型可以避免因为访问共享数据需要加锁而带来的一系列问题,例如锁的可伸缩性问题和死锁的问题。在Erlang中,所有的I/O操作也是通过消息传递的方式进行的:I/O驱动程序以Erlang虚拟机插件的形式实现为端口,端口也像Erlang进程一样可以接收和发送消息。Erlang进程之间不共享数据的特性还使得Erlang进程可以很方便地扩展到多个处理器上运行,因此Erlang的进程模型具有很好的可伸缩性。Erlang的这些特性使得Erlang成为各种需要高性能的网络服务程序的重要选择。目前使用到Erlang的领域包括网络服务器程序、聊天服务器程序、数据库服务器程序、缓存服务器程序和网络在线游戏服务器程序等,甚至在高性能计算领域也有对Erlang的应用。虽然根据以上描述,Erlang虚拟机可以提供很高的并发性,但是为了实现高性能的Erlang虚拟机,还需要具有高并行度的底层硬件的支持。
众核处理器的出现给高并行度Erlang虚拟机的实现成为可能。由于功耗和频率的限制,处理器技术的发展已经从追逐主频提升转变为在同一片处理器上集成更多的核心。目前处理器的发展趋势正在从复杂的单核心或少量复杂核心向带有大量简单核心的众核转变。多核处理器通常指的是目前市场上常见的带有2个以上核心的处理器,这种处理器的核心功能复杂,一般不超过16个核心。多核处理器的特点是单线程性能强大,但是功耗高且价格高。众核处理器虽然没有具体定义,但是通常指的是带有数十甚至上百个核心的处理器,未来甚至可能会出现带有成百上千核心的处理器。这种处理器除了具有核心数多的特点之外,在处理器结构和处理器核心之间的互联方式上和传统多核处理器也有较大区别。至强融核协处理器是Intel在2012年底发布的一款众核处理器,具有60个以上的核心,这些核心通过双向环形网络连接在一起,环形网络中穿插了8个双通道内存控制器。至强融核协处理器安装在PCIe扩展卡上,通过PCIe接口和宿主机进行通信。SCIF(Symmetric Communication Interface,对称通信接口)库是对PCIe接口的封装,所以宿主机和至强融核协处理器卡上的应用程序所有的交互都是通过SCIF进行的:宿主机和至强融核协处理器分别打开端点H和端点P,一个端点(例如H)监听,另一个端点(例如P)连接,当两个端点连接上之后就可以发送和接收消息。至强融核协处理器的PCIe接口逻辑也插在前述的环形网络中。由于Erlang进程之间不会共享数据,所以在主机上扩展至强融核协处理器理论上可以让更多的处理器核心来运行Erlang进程,提升Erlang虚拟机的并行度,从而提升Erlang虚拟机的性能,同时还能保持较高的效能。但是现有的Erlang虚拟机因为存在以下两个问题所以无法直接通过至强融核协处理器提升性能:1)由于缺乏对众核协处理器的支持,所以不能将Erlang虚拟机中运行的数目庞大的Erlang进程卸载(提交)到至强融核协处理器上运行;2)由于目前Erlang虚拟机是针对传统多核处理器进行优化的,所以如果Erlang虚拟机直接在至强融核协处理器上运行,无法感知众核处理器中众多核心的互联网络架构,现有的Erlang调度策略和进程分布策略会因为众核处理器底层的互联网络架构而影响Erlang进程间消息传递的效率,例如在传统多核处理器的系统中,每个核心访问内存的延迟差别不大,所以Erlang进程的分布对于消息传递的影响很小;而在至强融核协处理器中,内存控制器是分布在环形网络中的,所以核心和内存控制器的距离决定了核心访问内存控制器延迟的大小,因此消息传递频繁的Erlang进程如果分布在距离很远的核心上会降低消息传递的效率。
发明内容
本发明针对Erlang虚拟机无法直接将Erlang进程卸载到至强融核协处理器上运行以及无法充分利用至强融核协处理器众核处理能力的问题,提出一种能通过至强融核协处理器提升Erlang虚拟机性能的方法。
本发明提出的通过至强融核协处理器提升Erlang虚拟机性能的方法,针对各种基于Erlang的应用程序,特别是网络服务程序,该方法在宿主机上运行一个Erlang虚拟机的操作系统进程ERLVM_HOST,在至强融核协处理器卡上也运行一个Erlang虚拟机的操作系统进程ERLVM_PHI。所述的宿主机为安装至强融核协处理器PCIe扩展卡的计算机系统。
宿主机上的操作系统完成引导后,加载Erlang虚拟机ERLVM_HOST,ERLVM_HOST除了标准的Erlang虚拟机的功能之外,还进行以下操作:
(1.1)探测宿主机上是否安装了至强融核协处理器卡,如果安装了,启动至强融核协处理器卡上的ERLVM_PHI。
(1.2)在宿主机的每一个处理器核心上启动调度器线程,每个调度器线程依次尝试连接至强融核协处理器卡上的PROCESSEP_P、MSGEP_P和MIGEP_P端点,直到连接成功。
(1.3)启动进程管理辅助线程,将满足判断规则的新创建的Erlang进程提交到ERLVM_PHI上运行,并接收从ERLVM_PHI提交到宿主机执行的Erlang进程。
判断规则:当新创建的Erlang进程的层次编号大于等于offload_threshold时,新创建的Erlang进程被ERLVM_HOST提交给ERLVM_PHI运行;当ERLVM_PHI的状态为负载高或死亡时,ERLVM_HOST新创建的Erlang进程都不提交到ERLVM_PHI,由ERLVM_HOST的调度器线程运行。阈值变量offload_threshold的初始值通过ELRVM_HOST启动参数传入,并根据ERLVM_PHI的负载和健康状况进行动态更新,且offload_threshold_min≤offload_threshold≤offload_threshold_max;offload_threshold_min和offload_threshold_max分别表示阈值变量offload_threshold能够设定的最小值和最大值,都通过ELRVM_HOST启动参数传入。
(1.4)建立一个消息分发线程,创建端点MSGEP_H,ERLVM_PHI上的所有调度器都创建一个私有的消息分发端点与端点MSGEP_H连接,建立消息传递的信道。当ERLVM_PHI的某个调度器上运行的一个Erlang进程发送消息的目标Erlang进程在ERLVM_HOST上时,通过该调度器与端点MSGEP_H建立的信道发送消息。
(1.5)建立健康状况监测线程,从ERLVM_PHI的健康状况服务线程中接收ERLVM_PHI的处理器负载、内存负载以及至强融核协处理器的健康状况,根据监测数据将ERLVM_PHI标记为健康、负载高或者死亡。为平均CPU使用率设定经验阈值A,为总内存使用量设定经验阈值B。健康是指ERLVM_PHI上所有核心的平均CPU使用率低于A并且总内存使用量低于B,负载高是指ELRVM_PHI上所有核心的平均CPU使用率大于等于A或总内存使用量大于等于B,死亡是指至强融核协处理器卡出现故障不能正常工作。在ERLVM_PHI的状态为负载高时,ERLVM_HOST停止向ERLVM_PHI提交Erlang进程,而且如果ERLVM_HOST负载正常,从ERLVM_PHI上窃取Erlang进程执行;在ERLVM_PHI的状态为死亡时,ERLVM_HOST将所有在本地创建但是提交到ERLVM_PHI上运行的Erlang进程标记为异常。同时,ERLVM_HOST根据ERLVM_PHI的负载情况更新offload_threshold的值,如果ERLVM_PHI负载上升且上升速度快或提升到了一个上限值,则提升offload_threshold值,如果ERLVM_PHI的负载在下降且下降超过了一个下限值,则降低offload_threshold值。
(1.6)建立迁移分发线程,创建了端点MIGEP_H,ERLVM_PHI上的所有调度器都创建一个自己私有的进程迁移分发端点,并且和端点MIGEP_H连接,建立进程迁移的信道。当ERLVM_PHI需要向ERLVM_HOST迁移Erlang进程时,ERLVM_PHI向ERLVM_HOST发出迁移进程的请求,如果ERLVM_HOST接受迁移的进程,ERLVM_PHI和ERLVM_HOST在SCIF的注册地址空间中注册共享内存的窗口,然后ERLVM_PHI将要迁移的进程的上下文和堆数据复制到共享内存中,复制完成后,ERLVM_HOST的迁移分发线程接收共享内存中被迁移Erlang进程的数据,并将被迁移进程添加到合适的调度器的可运行队列中。ERLVM_PHI在将Erlang进程迁出之后在本地销毁被迁移的进程的数据,释放相应的内存。
ERLVM_PHI除了标准的Erlang虚拟机的职责之外,还完成以下操作:
(2.1)在至强融核协处理器卡的每一个处理器核心上启动调度器线程,每个调度器线程依次尝试连接宿主机的PROCESSEP_H、MSGEP_H和MIGEP_H端点,直到连接成功。
(2.2)启动进程管理辅助线程,接受从ERLVM_HOST提交到至强融核协处理器卡的Erlang进程,并在至强融核协处理器卡的可用内存空间不足时,将新创建的Erlang进程提交回宿主机的ERLVM_HOST上运行。
(2.3)建立一个消息分发线程,创建端点MSGEP_P,ERLVM_HOST上的所有调度器都创建一个自己私有的消息分发端点与端点MSGEP_P连接,建立消息传递的信道;至强融核协处理器卡上所有的I/O请求通过消息传递的信道发送到ERLVM_HOST,请求ERLVM_HOST处理,并将处理返回的结果分发给请求的Erlang进程。当ERLVM_HOST的某个调度器上运行的一个Erlang进程发送消息的目标Erlang进程在ERLVM_PHI上时,通过该调度器与端点MSGEP_P建立的信道发送消息。
(2.4)在距离每一个内存控制器最近的处理器核心上运行一个内存回收线程,每一个内存回收线程均等地负责靠近自己的处理器核心上的调度器的内存使用。内存回收线程定时对辖区内调度器上的Erlang进程进行垃圾回收。
(2.5)ERLVM_PHI进行Erlang进程负载均衡的时候考虑调度器所在处理器核心的距离,负载均衡算法在准备Erlang进程迁移路线的时候优先考虑距离近的处理器核心。
(2.6)建立进程迁移分发线程,创建了端点MIGEP_P,ERLVM_HOST上的所有调度器都创建一个自己私有的进程迁移分发端点,并与端点MIGEP_P连接,建立进程迁移的信道。
(2.7)建立健康状况服务线程,创建端点HEALTHEP_P,端点HEALTHEP_P与健康状况监测信道连接,建立健康状况监测信道;健康状况服务线程采集ERLVM_PHI中每个调度器的运行队列长度、每个处理器核心的CPU利用率以及每个内存控制器上空闲的物理内存容量,并将采集的监测数据通过健康状况监测信道发送给健康状况监测信道。
本发明的优点和积极效果在于:
(1)本发明的方法中宿主机上的Erlang虚拟机ERLVM_HOST能充分利用至强融核协处理器卡提供的众核处理能力,将大量Erlang进程卸载到至强融核协处理器卡上的Erlang虚拟机ERLVM_PHI上运行,最大限度地提升了Erlang虚拟机的并行度,提升了Erlang虚拟机的性能,使得Erlang虚拟机能够承受更大程度的吞吐量。
(2)本发明方法中改进的Erlang虚拟机在提升了性能的基础上,由于使用了密度更高且能效比更高的众核处理器,所以并没有成比例地增加功耗和设备的占地面积。
(3)本发明的方法对Erlang虚拟机的修改只涉及到底层的实现细节,不对Erlang语言本身的语法和语义做修改,因此现有的Erlang程序可以不经修改直接运行在本发明方法中所述的Erlang虚拟机上,保护了大量现有的利用Erlang编写的知识产权的价值。本发明方法中改进后的Erlang虚拟机依然可以运行在宿主机组成的集群中,因为ERLVM_HOST对外的接口没有变化,因此现有的利用Erlang编写的分布式程序也可以运行在本发明的方法改进后的Erlang虚拟机上。
附图说明
图1为本发明的方法所应用的系统结构示意图;
图2为本发明实施例中ERLVM_HOST和ERLVM_PHI中线程的端点连接关系示意图;
图3为本发明实施例中Erlang进程之间的关系和消息传递关系示意图;
图4为本发明方法中ERLVM_PHI进程管理辅助线程的工作流程图;
图5为本发明方法中ERLVM_PHI消息分发线程的工作流程图;
图6为本发明方法中ERLVM_PHI进程迁移分发线程的工作流程图;
图7为本发明实施例使用的至强融核协处理器的体系结构概念图。
具体实施方式
在下述具体实施示例中,结合附图对本发明进行进一步的详细说明。通过足够详细的描述这些实施示例,使得本领域技术人员能够理解和实践本发明。在不脱离本发明的主旨和范围的情况下,可以对实施做出逻辑的、实现的和其他的改变。因此,以下详细说明不应该被理解为限制意义,本发明的范围仅仅由权利要求来限定。
如图1所示,表示了一个典型的配置了至强融核协处理器卡的系统,在这个图中左侧表示宿主机环境,ERLVM_HOST是运行在这个环境中的一个操作系统进程;右侧表示至强融核协处理器卡环境,具体使用Intel Xeon PhiTM协处理器卡,ERLVM_PHI是运行在这个环境中的一个操作系统进程。ERLVM_HOST和ERLVM_PHI之间的所有通信都是通过SCIF库进行的,SCIF库对通过PCIe的通信进行了包装。操作系统进程和Erlang进程的概念不一样,前者表示在操作系统中运行,通过操作系统管理和调度的进程;而后者指的是运行在Erlang虚拟机ERLVM_HOST和ERLVM_PHI中的轻量级进程,这些进程是由Erlang虚拟机管理和调度的。
下面详述本发明的方法中ERLVM_HOST的具体启动过程。本发明实施例中宿主机上运行Linux操作系统。宿主机中的Linux操作系统完成引导后,加载Linux进程ERLVM_HOST,ERLVM_HOST的启动过程主要包括以下(1.0)~(1.6)几个步骤。
(1.0)和传统的Erlang虚拟机一样,初始化各个子系统模块的数据结构。
(1.1)通过至强融核协处理器卡的管理程序micctrl探测宿主机上是否安装了至强融核协处理器卡。如果没有安装协处理器卡,则按照传统Erlang虚拟机的启动方式完成ERLVM_HOST的启动,此时ERLVM_HOST的工作方式和传统的标准Erlang虚拟机完全相同。如果发现安装了协处理器卡,则通过管理程序micctrl启动协处理器卡,引导协处理器卡上的Linux操作系统,等待协处理器卡上的Linux操作系统完成引导,获得至强融核协处理器卡的节点编号,然后再进行下面的步骤。
(1.2)在宿主机的每一个处理器核心上启动调度器线程,并且将对应的调度器线程绑定在其所在的处理器核心上。在本发明的方法中,每一个调度器线程依次尝试连接至强融核协处理器卡节点上的PROCESSEP_P、MSGEP_P和MIGEP_P端点。协处理器卡上的ERLVM_PHI可能还没有完成加载,所以这些端点可能还没有成功创建,所以调度器线程需要不断尝试连接PROCESSEP_P、MSGEP_P和MIGEP_P端点,直到连接成功才可以继续执行调度器的工作。在图2所示的实施例中,宿主机上配置的是一个带有4核心的多核处理器,因此启动4个调度器线程。
(1.3)ERLVM_HOST启动进程管理辅助线程,将满足判断规则的新创建的Erlang进程提交到ERLVM_PHI上运行,并接收从ERLVM_PHI提交到宿主机执行的Erlang进程。
在标准的Erlang虚拟机中,调度器线程加载Erlang字节码和运行Erlang进程。在本发明的方法中,ERLVM_HOST的调度器线程还要判断新创建的Erlang进程是否应该卸载到ERLVM_PHI,即提交给ERLVM_PHI运行,判断的规则说明如下:
a)由于Erlang进程(除了根进程之外)是由父进程创建的,因此在一个系统上所有的Erlang进程构成一棵进程树(在实际中这种树也称为监视树)。将根进程定义为第0层的进程,那么进程树中的每一个Erlang进程都有一个层次编号。系统中设置有一个阈值变量offload_threshold用于判定新创建的Erlang进程的位置:当新创建的Erlang进程层次编号大于等于offload_threshold的时候,该新创建的Erlang进程被ERLVM_HOST提交给ERLVM_PHI运行,否则,由ERLVM_HOST的调度器线程执行。
offload_threshold的初始值是一个通过ELRVM_HOST启动参数传入的经验值。offload_threshold的值由ELRVM_HOST根据监测到的ERLVM_PHI负载和健康状况动态更新。offload_threshold的值不能大于offload_threshold_max,也不能小于offload_threshold_min。offload_threshold_max和offload_threshold_min的值也是通过ERLVM_HOST启动参数传入的经验值。
b)根据ERLVM_HOST监测的ERLVM_PHI的健康状况,如果ERLVM_PHI的状态为负载高或死亡,那么ERLVM_HOST创建的任何新的Erlang进程都不提交到ERLVM_PHI运行。
ERLVM_HOST将提交到ERLVM_PHI上运行的Erlang进程记录下来,在ELRVM_HOST发现ERLVM_PHI已经死亡时,将这些提交到ERLVM_PHI上运行的Erlang进程判定为异常终止,以便这些Erlang进程的父进程采取相应的操作,例如重启这些Erlang进程。
在ERLVM_PHI中有一个PROCESSEP_P端点用于提交要执行的进程。ERLVM_HOST上的所有调度器线程都创建一个自己私有的端点并且和PROCESSEP_P端点连接建立信道。当ERLVM_HOST创建了需要在ERLVM_PHI上执行的Erlang进程的时候,通过这个信道将新创建的Erlang进程的模块(其中包含了这个进程要执行的字节码)、函数和参数发送给ERLVM_PHI。
ERLVM_PHI在创建新Erlang进程的时候,也有可能会需要将进程提交到ERLVM_HOST上运行,因此在ERLVM_HOST上有一个线程专门接收来自ERLVM_PHI提交的Erlang进程并且将收到的进程请求分发到合适的调度器。
图3所示的是本发明实施例系统在运行时候的Erlang进程树的一个示意图。在这个示意图中,一共有14个进程,进程0是根进程。进程之间的实线表示父子进程的关系,因此在这个实施例中,进程0创建了进程1、2和3,进程3创建了进程4和11,以此类推。在这个实施例的图中,左侧标出了进程所在的层次。假定在该实施例中,阈值变量offload_threshold的初始值为3,那么层次大于等于3的Erlang进程都需要提交到ERLVM_PHI上创建。例如,调度器线程在运行进程4的时候,进程4要求创建进程5。由于进程4的层次编号为2,那么进程5的层次编号就应该为3,判定大于等于阈值变量offload_threshold,所以调度器线程将创建进程5所需的数据{模块、函数和参数}打包,并通过该调度器和PROCESSEP_P创建的进程管理信道将新进程的数据发送出去,并等待ERLVM_PHI发回的创建新Erlang进程的结果。如果创建成功,那么Erlang应用程序可以继续进行后续的操作;如果进程创建失败,调度器线程将ERLVM_PHI返回的失败原因传给Erlang进程4,Erlang进程4再根据应用程序本身的设计做出相应的处理。
图4是ERLVM_PHI中进程管理辅助线程的工作流程示意图,宿主机上的ERLVM_HOST中进程管理辅助线程的工作流程与图4同理,不同之处在于,ERLVM_HOST的进程管理辅助线程所创建的端点为PROCESSEP_H。
在宿主机上启动进程管理辅助线程,创建端点PROCESSEP_H供ERLVM_PHI连接。ERLVM_HOST在Erlang进程管理时,启动进程管理辅助线程,首先,进程管理辅助线程创建自己私有的端点列表,该端点列表在初始状态下为空;进程管理辅助线程创建了端点PROCESSEP_H之后,将端点PROCESSEP_H标记为监听端点,并将PROCESSEP_H添加到进程管理辅助线程的端点列表中。然后,进程管理辅助线程进入轮询端点列表的无限循环中。轮询端点列表的操作是阻塞的,直到可以无阻塞地从端点列表中被轮询的对象读取数据为止。当端点列表中出现了无阻塞读取的端点,进程管理辅助线程被唤醒,进程管理辅助线程逐一检查端点列表中无阻塞读取的端点,根据端点类型分别进行处理。如果无阻塞读取的端点为当前所在Erlang虚拟机的进程管理辅助线程创建的端点时,说明有来自对方Erlang虚拟机的连接请求。宿主机上,如果可无阻塞读取的端点为PROCESSEP_H,那么说明有了来自ERLVM_PHI的连接,创建新的进程管理端点和ERLVM_PHI建立一个进程管理的信道,并将新创建的进程管理端点加入到端点列表中。如果可无阻塞读取的端点为进程管理端点,那么说明ERLVM_PHI向宿主机发出了一个创建Erlang进程的请求,进程管理辅助线程从该创建进程的请求中提取出要创建的Erlang进程的模块、函数和参数,然后执行常规Erlang虚拟机进行新进程的创建操作。如果Erlang进程创建成功,则通过进程管理端点向ERLVM_PHI发送一个成功的回执,否则发送一个进程创建失败的消息,并在消息中附带进程创建失败的原因。检查完端点列表中所有端点并进行相应的操作之后,回到轮询端点列表的操作,进行下一次端点列表的轮询。如图2所示,在本发明的实施例中,ERLVM_PHI所在的至强融核协处理器卡上有60个核心,因此ERLVM_PHI会创建60个调度器线程,这些调度器线程都会连接ERLVM_HOST进程管理辅助线程创建的PROCESSEP_H端点。当ERLVM_PHI的所有调度器线程都连接了PROCESSEP_H端点之后,ERLVM_HOST进程管理辅助线程中的端点列表中会有61个端点,即PROCESSEP_H端点和60个分别对应ERLVM_PHI中每一个调度器线程的进程管理端点。当ERLVM_PHI中的任何一个调度器向PROCESSEP_H端点发出创建Erlang进程的请求时,ERLVM_HOST的进程管理辅助线程就会收到这个请求并在ERLVM_HOST上创建新的Erlang进程。
(1.4)建立ERLVM_HOST的Erlang进程和ERLVM_PHI的Erlang进程之间消息传递的消息信道。
在本发明的方法中,ERLVM_HOST和ERLVM_PHI都建立一个负责消息分发的线程,这两个线程分别建立端点MSGEP_H和端点MSGEP_P。ERLVM_HOST上的所有调度器线程都创建一个自己私有的端点并且和至强融核协处理器卡的端点MSGEP_P连接建立信道。ERLVM_PHI上的所有调度器都创建一个自己私有的消息分发端点并且和宿主机的端点MSGEP_H连接建立信道。当ERLVM_HOST/ERLVM_PHI上的某个调度器上运行的一个Erlang进程需要发送消息的时候,ERLVM_HOST/ERLVM_PHI判断目标Erlang进程的位置,如果在本地,则按照传统的方式传递消息,如果在ERLVM_PHI/ERLVM_HOST上,则通过调度器自身和对方消息端点MSGEP_P/MSGEP_H建立的信道发送消息。ERLVM_PHI/ERLVM_HOST的消息分发线程收到消息之后,将消息分发给目标Erlang进程。
此外,由于至强融核协处理器卡不支持I/O,所以ERLVM_PHI上的Erlang进程也通过上述的消息信道实现I/O。也就是,ERLVM_HOST还代理ERLVM_HOST和ERLVM_PHI所有的I/O访问请求,例如文件I/O端口、网络协议栈端口和其他I/O端口等。ERLVM_PHI上的所有Erlang进程通过所建立的消息通道发送给ERLVM_HOST,请求ERLVM_HOST处理,并将处理返回的结果分发给请求的Erlang进程,完成I/O访问。
如图5所示,为ERLVM_PHI消息分发线程的工作流程。宿主机上ERLVM_HOST的消息分发线程的工作流程与图5基本相同,不同之处在于,ERLVM_HOST的消息分发线程所创建的端点为MSGEP_H。
在宿主机上启动消息分发线程,创建端点MSGEP_H供ERLVM_PHI连接;宿主机ERLVM_HOST上的消息分发线程的总体流程类似进程管理辅助线程的流程。首先,消息分发线程建立一个自己的端点列表,端点列表初始为空,然后将所建立的端点MSGEP_H标记为监听状态,并加入到端点列表中;然后,通过一个无限循环不断轮询端点列表,并且对每一个可以无阻塞读取数据的端点进行处理。在消息分发线程中,端点列表中的端点也分为两类,一类是MSGEP_H端点,这个端点只有一个,用于接受来自ERLVM_PHI的连接请求并创建新的消息分发端点;如果无阻塞读取的端点为MSGEP_H,创建新的进程管理端点,与ERLVM_PHI建立一个消息传递的信道,并将创建的消息分发端点加入到端点列表中。另一类是消息分发端点,数目等同于ERLVM_PHI上的调度器数目,分别接受来自ERLVM_PHI上每一个调度器的消息分发请求,如果无阻塞读取的端点为消息分发端点,说明ERLVM_PHI的调度器发来一个消息分发请求。当收到ERLVM_PHI上的调度器发出的消息分发请求时,消息分发线程从这个请求中提取出消息的来源进程、目标进程以及消息体,通过常规Erlang虚拟机发送消息的方式将消息投递到目标进程的邮箱中并唤醒目标进程。如图3所示的本发明的实施例中,实线连接的Erlang进程是父子进程的关系,父子进程之间一定会有消息传递;虚线连接的Erlang进程表示这些进程间有消息传递。在这个例子中,除了实线连接的Erlang进城之外,进程1和进程5、6之间有消息传递,而且这些消息传递要跨宿主机和至强融核协处理器卡。例如当Erlang进程5要向Erlang进程1发送消息的时候,进程5所在的调度器——即一个运行在至强融核协处理器卡的ERLVM_PHI上的调度器——将发现进程1不在本地,而是在宿主机的ERLVM_HOST上,所以这个调度器将要发送的消息打包通过调度器和端点MSGEP_H建立的信道发送出去。ERLVM_HOST上的消息分发线程中和这个调度器对应的消息分发端点收到这个打包的消息,当消息分发线程的循环开始轮询端点列表的时候,发现这个端点中有数据可以直接读取,因此消息分发线程取出这个消息的数据并分发到(投递到)目标Erlang进程——进程1——的邮箱中并调度进程1。
(1.5)建立健康状况监测线程,从ERLVM_PHI的健康状况服务线程中接收ERLVM_PHI的处理器负载、内存负载以及至强融核协处理器的健康状况,监测ERLVM_PHI的负载和健康状况,调整本地的进程创建策略。在本发明的方法中,ERLVM_HOST持续对ERLVM_PHI的健康状况进行监测,监测的内容包括处理器负载、内存负载以及至强融核协处理器的健康状况,并且根据监测数据将ERLVM_PHI标记为以下状态之一:健康、负载高、死亡。健康指的是ERLVM_PHI上所有核心的平均CPU使用率低于一个经验阈值A并且总内存使用量低于一个经验阈值B,在这种状态下ERLVM_PHI正常运行,并且可以接受新的Erlang进程的提交。负载高指的是ELRVM_PHI上所有核心的平均CPU使用率大于等于一个经验阈值A或总内存使用量大于等于一个经验阈值B,在这种状态下ERLVM_PHI可以正常运行,但是不可接受新的Erlang进程的提交。死亡指的是至强融核协处理器卡发生任何故障导致宿主机检测到至强融核协处理器卡不能正常工作,在这种状态下ERLVM_PHI不能正常运行。
在健康状态下,ERLVM_HOST可以正常向ERLVM_PHI提交Erlang进程执行;在负载高的状态下,ERLVM_HOST不可向ERLVM_PHI提交Erlang进程执行,而且如果ERLVM_HOST负载正常,还应从ERLVM_PHI上窃取Erlang进程执行;在死亡的状态下,ERLVM_PHI无法正常运行,所以ERLVM_HOST将所有在本地创建但是提交到ERLVM_PHI上运行的Erlang进程标记为异常退出,这些Erlang进程的父进程会根据Erlang程序本身做出相应的处理。
同时,ERLVM_HOST还要根据ERLVM_PHI的负载情况更新offload_threshold的值:如果ERLVM_PHI负载上升且上升速度快,则提升offload_threshold值;如果ERLVM_PHI负载提升到了一个上限值,则提升offload_threshold值;如果ERLVM_PHI的负载在下降且下降超过了一个下限值,则降低offload_threshold值。提升和降低offload_threshold值的时候都要注意不能超过offload_threshold_max和offload_threshold_min约束的上下限。
ERLVM_HOST上单独运行一个健康状况监测线程,这个线程连接ERLVM_PHI上的健康状况服务线程创建的端点HEALTHEP_P,建立健康状况监测信道。健康状况监测线程在建立健康状况监测信道后,不断地从ERLVM_PHI获得健康信息的监测数据。如果健康状况监测线程和HEALTHEP_P建立的健康信息信道异常中断,则说明ERLVM_PHI异常退出。ERLVM_HOST通过micctrl工具判断至强融核协处理器是否处于死亡状态。
由于健康状况监测线程在启动的时候ERLVM_PHI上对应的HEALTHEP_P还没有来得及创建完成,所以健康状况监测线程不断地重新尝试连接HEALTHEP_P端点,直到连接成功为止。连接成功创建健康状况监测信道之后,健康状况监测线程进入一个无限循环。在这个无限循环中:健康状况监测线程首先向HEALTHEP_P发送一个请求;然后等待ERLVM_PHI将采集的健康状况的监测数据发送回,成功收到监测数据之后再根据数据做进一步处理:判定ERLVM_PHI的健康状况、提升或降低offload_threshold值以及在ERLVM_PHI死亡的情况下对相应的Erlang进程做处理;完成处理之后进入下一次循环。
(1.6)实现ERLVM_HOST和ERLVM_PHI之间的Erlang进程迁移的功能。在本发明的方法中,Erlang进程分布在ERLVM_HOST和ERLVM_PHI上运行,因此在有需要的情况下Erlang进程需要在ERLVM_HOST和ERLVM_PHI之间进行迁移。需要在ERLVM_HOST和ERLVM_PHI之间迁移Erlang进程的情况包括:ERLVM_HOST负载高,但是ERLVM_PHI的负载低的情况,ERLVM_HOST需要向ERLVM_PHI迁移Erlang进程;ERLVM_PHI的可用内存低的情况下,ERLVM_PHI上的Erlang进程可能会申请内存失败并且无法创建新的Erlang进程,所以在这种情况下ERLVM_PHI需要向ERLVM_HOST迁移Erlang进程。
本发明方法在宿主机上启动进程迁移分发线程,创建端点MIGEP_H,ERLVM_PHI上的所有调度器都创建一个自己私有的进程迁移分发端点,并且和端点MIGEP_H连接,建立进程迁移的信道。当ERLVM_PHI需要向ERLVM_HOST迁移Erlang进程时,ERLVM_PHI向ERLVM_HOST发出迁移进程的请求,如果ERLVM_HOST接受迁移的进程,ERLVM_PHI和ERLVM_HOST在SCIF的注册地址空间中注册共享内存的窗口,然后ERLVM_PHI将要迁移的进程的上下文信息和堆复制到共享内存中,复制完成后,ERLVM_HOST的迁移分发线程接收迁移入Erlang进程的线程在本地创建被迁移进程的数据结构,并且将被迁移进程添加到合适的调度器的可运行队列中。ERLVM_HOST/ERLVM_PHI端在将Erlang进程迁出之后在本地销毁被迁移进程的数据,释放相应的内存。
如图6所示,为ERLVM_PHI进程迁移分发线程的工作流程。宿主机上ERLVM_HOST的进程迁移分发线程的工作流程与图6基本相同,不同之处在于,ERLVM_HOST的进程迁移分发线程所创建的端点为MIGEP_H。
宿主机ERLVM_HOST上的进程迁移分发线程的总体流程类似进程管理辅助线程的流程。首先,进程迁移分发线程创建自己的端点列表,端点列表在初始状态下为空,标记所创建的端点MIGEP_H/MIGEP_P为监听端点,并将MIGEP_H/MIGEP_P添加到端点列表中;然后,进程迁移分发线程通过一个无限循环不断轮询端点列表,并且对每一个可以无阻塞读取数据的端点进行相应处理。在进程迁移分发线程中,端点列表中的端点也分为两类,一类是MIGEP_P端点,这个端点只有一个,用于接受来自ERLVM_PHI的连接请求并创建新的进程迁移分发端点,如果无阻塞读取的端点为MIGEP_H/MIGEP_P,创建新的进程迁移分发端点,与ERLVM_PHI建立一个进程迁移的信道,并将创建的进程迁移分发端点加入到端点列表中。另一类是进程迁移分发端点,数目等同于ERLVM_PHI上的调度器数目,分别接受来自ERLVM_PHI上每一个调度器的迁移进程的请求,如果无阻塞读取的端点为进程迁移分发端点,说明ERLVM_PHI/ERLVM_HOST的调度器发来一个进程迁移请求。进程迁移请求中包含被迁移进程所需要的堆空间。当收到ERLVM_PHI上的调度器发出的进程迁移请求时,进程迁移分发线程从该进程迁移请求中提取出被迁移进程所需要的堆空间和上下文数据所需的空间,并且根据这些空间需求在对应的进程迁移分发端点中注册一个可以让ERLVM_PHI上的调度器写入的内存窗口,并将这个内存窗口的偏移量发送给请求ERLVM_PHI上请求迁移进程的调度器。ERLVM_PHI上请求迁移进程的调度器收到这个注册窗口的偏移量之后将被迁移Erlang进程的堆和上下文数据复制到进程迁移分发线程注册的内存窗口中。进程迁移分发线程确认数据写入完毕之后,根据被迁移Erlang进程的堆数据和上下文数据在ERLVM_HOST上重新建立被迁移Erlang进程的运行环境,然后将被迁移的Erlang进程添加到某一个调度器的队列中开始这个进程在ERLVM_HOST中新的生命周期。这些操作成功之后,进程迁移分发线程向ERLVM_PHI中发出请求的调度器发出一个确认消息,表示迁移已经完成。ERLVM_PHI中的调度器收到确认消息之后销毁被迁移Erlang进程在本地的数据,释放相应的内存空间。如果空间依然紧张,则再次寻找一个可以被迁移的Erlang进程并迁移至ERLVM_HOST。
至强融核协处理器卡及其Linux操作系统被宿主机上的ERLVM_HOST启动并完成引导之后开始启动Linux进程ERLVM_PHI,ERLVM_PHI的启动过程主要包括以下(2.0)~(2.7)几个步骤。
(2.0)和传统的Erlang虚拟机一样,初始化各个子系统模块的数据结构。
(2.1)在至强融核协处理器卡的每一个处理器核心上启动调度器线程。至强融核协处理器有60或61个处理器核心,每一个核心支持4个硬件线程,因此在每一个核心上启动1个以上调度器线程可以更好地利用处理器核心的计算资源,隐藏单个线程访问内存的延迟,但是在一个核心上启动的调度器线程数等于或大于硬件线程数可能会因为引入了其他开销反而降低性能,达不到所期望的加速比。在本发明的实施例中,至强融核协处理器一共有60个核心,默认在一个处理器核心上启动一个调度器线程,在实际的实施中,也可以选择在一个核心上启动2-4个调度器线程。所以在本发明的实施例中,一共在至强融核协处理器卡上启动了60个调度器线程。类似宿主机上的调度器线程,这些调度器线程要依次连接宿主机ERLVM_HOST上的PROCESSEP_H、MSGEP_H和MIGEP_H端点,并且不断尝试直到连接成功。
(2.2)在至强融核协处理器卡上启动进程管理辅助线程,接受从ERLVM_HOST提交到至强融核协处理器卡的Erlang进程,并在至强融核协处理器卡的可用内存空间不足时,将新创建的Erlang进程提交回宿主机的ERLVM_HOST上运行。ERLVM_PHI的进程管理辅助线程和宿主机上ERLVM_HOST的进程管理辅助线程是对称的,功能类似,因此具体的工作流程可以参考ERLVM_HOST上的进程管理辅助线程的工作流程,如图4所示。
图4中,首先,进程管理辅助线程创建自己的端点列表,端点列表在初始状态下为空,标记所创建的端点PROCESSEP_P为监听端点,并将PROCESSEP_P添加到端点列表中。然后,进程管理辅助线程进入轮询端点列表的无限循环中。当端点列表中出现无阻塞读取的端点时,进程管理辅助线程逐一检查端点列表中无阻塞读取的端点,并对各无阻塞读取的端点进行判断处理。如果无阻塞读取的端点为PROCESSEP_P,创建新的进程管理端点,与ERLVM_HOST建立一个进程管理的信道,并将创建的进程管理端点加入到端点列表中。如果无阻塞读取的端点为进程管理端点,说明ERLVM_HOST向宿主机/至强融核协处理器卡发出了一个创建Erlang进程的请求,进程管理辅助线程从该请求中提取出所要创建的Erlang进程的模块、函数和参数,在本地进行新进程的创建,如果Erlang进程创建成功,则通过进程管理端点向ERLVM_HOST发送一个成功的回执,否则发送一个进程创建失败的消息,并在消息中附带进程创建失败的原因;在对端点列表中所有无阻塞读取的端点进行判断处理后,回到轮询端点列表的操作。
(2.3)在至强融核协处理器卡上启动消息分发线程,创建端点MSGEP_P,ERLVM_HOST上的所有调度器都创建一个自己私有的消息分发端点与端点MSGEP_P连接,建立消息传递的信道。ERLVM_PHI的消息分发线程和宿主机上ERLVM_HOST的消息分发线程是对称的,功能类似,因此具体的工作流程可以参考ERLVM_HOST上的消息分发线程的工作流程,如图5所示。
图5中,首先,消息分发线程创建自己的端点列表,端点列表在初始状态下为空,标记所创建的端点MSGEP_P为监听端点,并将MSGEP_P添加到端点列表中。然后,消息分发线程通过一个无限循环不断轮询端点列表。当端点列表中出现无阻塞读取的端点时,消息分发线程逐一检查端点列表中无阻塞读取的端点,并对各无阻塞读取的端点进行判断处理。如果无阻塞读取的端点为MSGEP_P,创建新的进程管理端点,与ERLVM_HOST建立一个消息传递的信道,并将创建的消息分发端点加入到端点列表中。如果无阻塞读取的端点为消息分发端点,说明ERLVM_HOST的调度器发来一个消息分发请求,消息分发线程从该请求中提取出消息的来源进程、目标进程以及消息体,并投递到目标进程的邮箱中并唤醒目标进程。在对端点列表中所有无阻塞读取的端点进行判断处理后,回到轮询端点列表的操作。
(2.4)内存管理。至强融核协处理器卡上没有任何高速大容量的持久化存储设备,因此ERLVM_PHI的虚拟地址空间中所有地址都必须以物理内存作为后备,如果物理内存不够,无法将虚拟地址空间中的任何页面换出到物理内存之外的存储设备。在本发明的方法中,如果至强融核协处理器卡上的物理内存空间不足以支撑新创建的Erlang进程或Erlang进程对空间的申请,ERLVM_PHI必须将相关的线程提交给或迁移至ERLVM_HOST运行,迁移成功销毁被迁移的Erlang进程在本地的数据。为了尽可能地保持至强融核协处理器卡上有足够的物理内存使用,在距离每一个内存控制器最近的处理器核心上运行一个内存回收线程(因为至强融核协处理器卡上有8个内存控制器,所以一共有8个内存回收线程),每一个内存回收线程均等地负责靠近自己的处理器核心上的调度器的内存使用。内存回收线程需要定时对辖区内Erlang进程进行垃圾回收。
(2.5)面向众核处理器的负载均衡:标准的Erlang虚拟机中会对各个调度器的负载进行均衡。负载比较重的调度器会将自己运行队列中的一些Erlang进程迁移到其他负载较轻的调度器上;没有负载的调度器会试图从其他调度器的运行队列中窃取Erlang进程运行,以确保每个调度器的总体负载是近似相等的,这样可以保证整体Erlang进程的响应性,充分利用多核的运算资源。在本发明的方法中,ERLVM_PHI运行在至强融核众核协处理器上,和多核处理器相比,众核协处理器具有内存访问非均匀性的特点,距离最远的两个核心之间的延迟会是相邻两个核心之间延迟的数倍。因此本发明的方法中,调度器能够感知至强融核众核协处理器的拓扑结构,在进行负载均衡的时候,考虑调度器所在处理器核心的距离,并首先考虑距离近的核心上的调度器。如果不能通过距离近的核心上的调度器进行负载均衡,则扩大考虑的核心的距离,逐步增大考虑的距离,直到完成负载均衡的操作。
在标准的Erlang虚拟机中,多个调度器运行在一个对称多处理器系统中,调度器有两种负载均衡机制:Erlang进程窃取和Erlang进程分享。Erlang进程窃取发生在有调度器空闲没有Erlang进程执行的时候,这时标准的Erlang虚拟机在全局范围中从其他调度器窃取可以执行的Erlang进程。在本发明的方法中,当调度器空闲没有Erlang进程执行的时候,不从全局范围中寻找可以窃取Erlang进程的调度器,而是从和自己距离最近的调度器开始寻找可以窃取Erlang进程的调度器。在本发明的实施例中,至强融核协处理器卡上一共有60个调度器,这些调度器的编号分别为0-59,依次在至强融核协处理器卡上的每一个核心上创建,由于至强融核协处理器的60个核心通过环形网络互联,所以这些调度器也连接成一个60个调度节点的环。在本发明的实施例中,例如调度器20没有Erlang进程可以运行,那么这个调度器依次寻找调度器19、调度器21、调度器18、调度器22,以此类推,直到完成进程窃取操作。Erlang进程分享发生在调度器之间的负载出现一定的差异时,这时在标准的Erlang虚拟机中,各个调度器之间会根据负载情况进行协调,将负载较高的调度器上的Erlang进程迁移到负载较低的调度器上执行。在本发明的方法中,由于多个调度器连接成一个环形结构,调度器访问内存的延迟不均匀,所以如果在全局范围内进行负载均衡可能会产生较大的内存延迟,因此本发明的方法根据处理器核心到内存控制器的距离对处理器核心进行分组,也即对调度器进行分组。如图7所示的是本发明的实施例中至强融核协处理器的架构简图,图中反映了处理器核心到内存控制器的距离,图中的MC表示内存控制器,在本发明的实施例中的至强融核协处理器一共有8个内存控制器。在图7所示的实施例中,展示了分组方法,根据处理器核心到内存控制器的距离将60个核心分为4个分组:核心7—核心21为一个分组、核心22—核心36为一个分组、核心37—核心51为一个分组、核心52—核心6为一个分组。在本发明的方法中,基于Erlang进程分享的负载均衡在分组中进行,避免跨分组的Erlang进程迁移。
(2.6)在至强融核协处理器卡上启动进程迁移分发线程,创建了端点MIGEP_P。ERLVM_PHI的进程迁移分发线程和宿主机上ERLVM_HOST的进程迁移分发线程是对称的,功能类似,因此具体的工作流程可以参考ERLVM_HOST上的进程迁移分发线程的工作流程,如图6所示。
图6中,首先,进程迁移分发线程创建自己的端点列表,端点列表在初始状态下为空,标记所创建的端点MIGEP_P为监听端点,并将MIGEP_P添加到端点列表中;然后,进程迁移分发线程通过一个无限循环不断轮询端点列表。当端点列表中出现无阻塞读取的端点时,进程迁移分发线程逐一检查端点列表中无阻塞读取的端点,并对各无阻塞读取的端点进行如下判断处理:如果无阻塞读取的端点为MIGEP_P,创建新的进程迁移分发端点,与ERLVM_HOST建立一个进程迁移的信道,并将创建的进程迁移分发端点加入到端点列表中。如果无阻塞读取的端点为进程迁移分发端点,说明ERLVM_HOST的调度器发来一个进程迁移请求,进程迁移分发线程从该请求中提取出被迁移进程所需要的堆空间和上下文数据所需的空间,并根据空间需求在对应的进程迁移分发端点中注册一个让ERLVM_HOST上的调度器写入的内存窗口,并将内存窗口的偏移量发送给请求迁移进程的调度器,ERLVM_HOST上请求迁移进程的调度器在收到内存窗口的偏移量后,将被迁移Erlang进程的堆和上下文数据复制到该内存窗口中。进程迁移分发线程确认数据写入完毕之后,根据被迁移Erlang进程的堆和上下文数据,在RLVM_PHI上重新建立被迁移Erlang进程的运行环境,将被迁移的Erlang进程添加到某一个调度器的队列中执行。在进程迁移操作成功之后,进程迁移分发线程向ERLVM_HOST发出进程迁移请求的调度器发出一个表示迁移已经完成的确认消息。ERLVM_HOST中的调度器收到确认消息之后销毁被迁移Erlang进程在本地的数据,释放内存空间。在对端点列表中所有无阻塞读取的端点进行判断处理后,回到轮询端点列表的操作。
(2.7)在至强融核协处理器卡上启动健康状况服务线程。健康状况服务线程首先创建HEALTHEP_P端点,将HEALTHEP_P端点设置为监听状态,等待宿主机的连接。在端点HEALTHEP_P和健康状况监测线程连接上之后,健康状况服务线程进入一个无限循环。在这个无限循环中,等待宿主机发来健康状况监测的请求,收到该请求后,采集至强融核协处理器卡上每一个调度器的运行队列长度、每一个处理器核心的CPU利用率以及每一个内存控制器上空闲的物理内存容量,将这些采集的监测数据打包发送回宿主机的ERLVM_HOST的健康状况监测线程,之后便进入下一次循环中。
在本发明的方法中,ERLVM_PHI重启后所有调度器的运行队列为空,全部在等待ERLVM_HOST提交的Erlang进程。为了加快ERLVM_HOST向ERLVM_PHI提交进程的速度,ERLVM_PHI在环形网络中靠近PCIe逻辑的核心上创建负责接收提交Erlang进程的进程管理辅助线程,并且在这个线程中开启PROCESSEP_P端点。ERLVM_PHI中的Erlang进程在执行的时候,有可能会创建新的Erlang进程。由于进程间通信很可能发生在子进程和父进程之间,所以在创建新的Erlang进程的时候,根据处理器核心的负载情况,将新的Erlang进程放置在父进程所在的核心上或附近的核心上运行。如果在创建新的Erlang进程的时候,发现本地的可用内存空间不够,那么需要将新的Erlang进程提交回宿主机的ERLVM_HOST上运行。在ERLVM_HOST上有一个PROCESSEP_H端点,这个端点专门用于ERLVM_PHI提交进程。ERLVM_PHI上的每一个调度器都和PROCESSEP_H端点建立通信信道。当ERLVM_PHI上的调度器需要向ERLVM_HOST提交进程的时候,通过这个信道将新创建进程的模块(其中包含了这个进程要执行的字节码)、函数和参数发送给ERLVM_HOST。
Claims (6)
1.一种通过至强融核(Xeon PhiTM)协处理器提升Erlang虚拟机性能的方法,其特征在于,在宿主机上运行一个Erlang虚拟机的操作系统进程ERLVM_HOST,在至强融核协处理器卡上运行一个Erlang虚拟机的操作系统进程ERLVM_PHI;宿主机是指安装至强融核协处理器PCIe扩展卡的计算机系统;
ERLVM_HOST在宿主机上的启动包括如下操作:
(1.1)探测宿主机是否安装了至强融核协处理器卡,如果安装了,启动至强融核协处理器卡上的ERLVM_PHI;
(1.2)在宿主机的每一个处理器核心上启动调度器线程,每个调度器线程依次尝试连接至强融核协处理器卡的PROCESSEP_P、MSGEP_P和MIGEP_P端点,直到连接成功;
(1.3)启动进程管理辅助线程,创建端点PROCESSEP_H,将满足判断规则的新创建的Erlang进程提交到ERLVM_PHI上运行,接受从ERLVM_PHI提交来的Erlang进程;
判断规则:当新创建的Erlang进程的层次编号大于等于阈值变量offload_threshold时,新创建的Erlang进程被ERLVM_HOST提交给ERLVM_PHI;当ERLVM_PHI的状态为负载高或死亡时,新创建的Erlang进程不提交给ERLVM_PHI;阈值变量offload_threshold的初始值通过ELRVM_HOST启动参数传入,并根据ERLVM_PHI的负载和健康状况进行动态更新,且offload_threshold_min≤offload_threshold≤offload_threshold_max;offload_threshold_min和offload_threshold_max分别表示阈值变量offload_threshold能够设定的最小值和最大值,都通过ELRVM_HOST启动参数传入;
(1.4)建立消息分发线程,创建端点MSGEP_H,ERLVM_PHI上的所有调度器都创建一个自己私有的消息分发端点与端点MSGEP_H连接,建立消息传递的信道;
(1.5)建立健康状况监测线程,从ERLVM_PHI的健康状况服务线程中接收ERLVM_PHI的处理器负载、内存负载以及至强融核协处理器的健康状况,根据监测数据将ERLVM_PHI标记为健康、负载高或者死亡;为平均CPU使用率设定经验阈值A,为总内存使用量设定经验阈值B,健康是指ERLVM_PHI上所有核心的平均CPU使用率低于A并且总内存使用量低于B,负载高是指ELRVM_PHI上所有核心的平均CPU使用率大于等于A或总内存使用量大于等于B,死亡是指至强融核协处理器卡出现故障不能正常工作;在ERLVM_PHI的状态为负载高时,ERLVM_HOST停止向ERLVM_PHI提交Erlang进程,而且如果ERLVM_HOST负载正常,从ERLVM_PHI上窃取Erlang进程执行;在ERLVM_PHI的状态为死亡时,ERLVM_HOST将所有在本地创建但是提交到ERLVM_PHI上运行的Erlang进程标记为异常退出;ERLVM_HOST根据ERLVM_PHI的负载情况更新offload_threshold的值;
(1.6)建立进程迁移分发线程,创建了端点MIGEP_H,ERLVM_PHI上的所有调度器都创建一个自己私有的进程迁移分发端点,并与端点MIGEP_H连接,建立进程迁移的信道;
ERLVM_PHI在至强融核协处理器卡上启动,包括如下操作:
(2.1)在至强融核协处理器卡的每一个处理器核心上启动调度器线程,每个调度器线程依次尝试连接宿主机的PROCESSEP_H、MSGEP_H和MIGEP_H端点,直到连接成功;
(2.2)启动进程管理辅助线程,创建端点PROCESSEP_P,接受从ERLVM_HOST提交到至强融核协处理器卡的Erlang进程,并在至强融核协处理器卡的可用内存空间不足时,将新创建的Erlang进程提交回宿主机的ERLVM_HOST上运行;
(2.3)建立一个消息分发线程,创建端点MSGEP_P,ERLVM_HOST上的所有调度器都创建一个私有的消息分发端点与端点MSGEP_P连接,建立消息传递的信道;至强融核协处理器卡上所有的I/O请求通过消息传递的信道发送到ERLVM_HOST,请求ERLVM_HOST处理,并将处理返回的结果分发给请求的Erlang进程;
(2.4)在至强融核协处理器卡上,距离每一个内存控制器最近的处理器核心上运行一个内存回收线程,每一个内存回收线程均等地负责靠近自己的处理器核心上的调度器的内存使用,定时对辖区内调度器上的Erlang进程进行垃圾回收;
(2.5)ERLVM_PHI进行Erlang进程负载均衡的时候考虑调度器所在处理器核心的距离,负载均衡算法在准备Erlang进程迁移路线的时候优先考虑距离近的处理器核心;
(2.6)建立进程迁移分发线程,创建了端点MIGEP_P,ERLVM_HOST上的所有调度器都创建一个自己私有的进程迁移分发端点,并与端点MIGEP_P连接,建立进程迁移的信道;
(2.7)建立健康状况服务线程,创建端点HEALTHEP_P,端点HEALTHEP_P与健康状况监测线程连接,建立健康状况监测信道;健康状况服务线程采集ERLVM_PHI中每个调度器的运行队列长度、每个处理器核心的CPU利用率以及每个内存控制器上空闲的物理内存容量,并将采集的监测数据通过健康状况监测信道发送给健康状况监测线程。
2.根据权利要求1所述的通过至强融核协处理器提升Erlang虚拟机性能的方法,其特征在于,所述的ERLVM_HOST/ERLVM_PHI的进程管理辅助线程,具体工作流程为:
首先,进程管理辅助线程创建自己的端点列表,端点列表在初始状态下为空,标记所创建的端点PROCESSEP_H/PROCESSEP_P为监听端点,并将PROCESSEP_H/PROCESSEP_P添加到端点列表中;
然后,进程管理辅助线程进入轮询端点列表的无限循环中;当端点列表中出现无阻塞读取的端点时,进程管理辅助线程逐一检查端点列表中无阻塞读取的端点,并对各无阻塞读取的端点进行如下判断处理:如果无阻塞读取的端点为PROCESSEP_H/PROCESSEP_P,创建新的进程管理端点,与ERLVM_PHI/ERLVM_HOST建立一个进程管理的信道,并将创建的进程管理端点加入到端点列表中;如果无阻塞读取的端点为进程管理端点,说明ERLVM_PHI/ERLVM_HOST向宿主机/至强融核协处理器卡发出了一个创建Erlang进程的请求,进程管理辅助线程从该请求中提取出所要创建的Erlang进程的模块、函数和参数,在本地进行新进程的创建,如果Erlang进程创建成功,则通过进程管理端点向ERLVM_PHI/ERLVM_HOST发送一个成功的回执,否则发送一个进程创建失败的消息,并在消息中附带进程创建失败的原因;在对端点列表中所有无阻塞读取的端点进行判断处理后,回到轮询端点列表的操作。
3.根据权利要求1所述的通过至强融核协处理器提升Erlang虚拟机性能的方法,其特征在于,所述的ERLVM_HOST/ERLVM_PHI的消息分发线程,具体工作流程为:
首先,消息分发线程创建自己的端点列表,端点列表在初始状态下为空,标记所创建的端点MSGEP_H/MSGEP_P为监听端点,并将MSGEP_H/MSGEP_P添加到端点列表中;
然后,消息分发线程通过一个无限循环不断轮询端点列表;当端点列表中出现无阻塞读取的端点时,消息分发线程逐一检查端点列表中无阻塞读取的端点,并对各无阻塞读取的端点进行如下判断处理:如果无阻塞读取的端点为MSGEP_H/MSGEP_P,创建新的进程管理端点,与ERLVM_PHI/ERLVM_HOST建立一个消息传递的信道,并将创建的消息分发端点加入到端点列表中;如果无阻塞读取的端点为消息分发端点,说明ERLVM_PHI/ERLVM_HOST的调度器发来一个消息分发请求,消息分发线程从该请求中提取出消息的来源进程、目标进程以及消息体,并投递到目标进程的邮箱中并唤醒目标进程;在对端点列表中所有无阻塞读取的端点进行判断处理后,回到轮询端点列表的操作。
4.根据权利要求1所述的通过至强融核协处理器提升Erlang虚拟机性能的方法,其特征在于,所述的ERLVM_HOST/ERLVM_PHI的进程迁移分发线程,具体工作流程为:
首先,进程迁移分发线程创建自己的端点列表,端点列表在初始状态下为空,标记所创建的端点MIGEP_H/MIGEP_P为监听端点,并将MIGEP_H/MIGEP_P添加到端点列表中;
然后,进程迁移分发线程通过一个无限循环不断轮询端点列表;当端点列表中出现无阻塞读取的端点时,进程迁移分发线程逐一检查端点列表中无阻塞读取的端点,并对各无阻塞读取的端点进行如下判断处理:如果无阻塞读取的端点为MIGEP_H/MIGEP_P,创建新的进程迁移分发端点,与ERLVM_PHI/ERLVM_HOST建立一个进程迁移的信道,并将创建的进程迁移分发端点加入到端点列表中;如果无阻塞读取的端点为进程迁移分发端点,说明ERLVM_PHI/ERLVM_HOST的调度器发来一个进程迁移请求,进程迁移分发线程从该请求中提取出被迁移进程所需要的堆空间和上下文数据所需的空间,并根据空间需求在对应的进程迁移分发端点中注册一个让ERLVM_PHI/ERLVM_HOST上的调度器写入的内存窗口,并将内存窗口的偏移量发送给请求迁移进程的调度器,ERLVM_PHI/ERLVM_HOST上请求迁移进程的调度器在收到内存窗口的偏移量后,将被迁移Erlang进程的堆和上下文数据复制到该内存窗口中;进程迁移分发线程确认数据写入完毕之后,根据被迁移Erlang进程的堆和上下文数据,在ERLVM_HOST/RLVM_PHI上重新建立被迁移Erlang进程的运行环境,将被迁移的Erlang进程添加到某一个调度器的队列中执行;在进程迁移操作成功之后,进程迁移分发线程向ERLVM_PHI/ERLVM_HOST发出进程迁移请求的调度器发出一个表示迁移已经完成的确认消息,ERLVM_PHI/ERLVM_HOST中的调度器收到确认消息之后销毁被迁移Erlang进程在本地的数据,释放内存空间;在对端点列表中所有无阻塞读取的端点进行判断处理后,回到轮询端点列表的操作。
5.根据权利要求1所述的通过至强融核协处理器提升Erlang虚拟机性能的方法,其特征在于,所述的ERLVM_HOST的健康状况监测线程,具体工作流程为:首先,健康状况监测线程不断地尝试连接端点HEALTHEP_P,直到连接成功为止;然后,创建健康状况监测信道,健康状况监测线程进入一个无限循环:健康状况监测线程首先向HEALTHEP_P发送一个健康状况监测的请求,然后等待HEALTHEP_P将采集的监测数据发送回,在收到监测数据后,根据监测数据标记ERLVM_PHI的状态、提升或降低offload_threshold值以及在ERLVM_PHI死亡的情况下对相应的Erlang进程做处理;完成处理之后进入下一次循环。
6.根据权利要求1或5所述的通过至强融核协处理器提升Erlang虚拟机性能的方法,其特征在于,所述的ERLVM_PHI的健康状况服务线程,具体工作流程为:首先,健康状况服务线程创建端点HEALTHEP_P,并将端点HEALTHEP_P设置为监听状态,等待宿主机的连接;然后,在端点HEALTHEP_P和健康状况监测线程连接上之后,健康状况服务线程进入一个无限循环:等待宿主机发来健康状况监测的请求,在收到请求后,采集ERLVM_PHI中每个调度器的运行队列长度、每个处理器核心的CPU利用率以及每个内存控制器上空闲的物理内存容量,将采集的监测数据发送给健康状况监测线程;之后进入下一次循环。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310184628.7A CN103294540B (zh) | 2013-05-17 | 2013-05-17 | 一种通过至强融核协处理器提升Erlang虚拟机性能的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310184628.7A CN103294540B (zh) | 2013-05-17 | 2013-05-17 | 一种通过至强融核协处理器提升Erlang虚拟机性能的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103294540A true CN103294540A (zh) | 2013-09-11 |
CN103294540B CN103294540B (zh) | 2014-05-14 |
Family
ID=49095472
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310184628.7A Expired - Fee Related CN103294540B (zh) | 2013-05-17 | 2013-05-17 | 一种通过至强融核协处理器提升Erlang虚拟机性能的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103294540B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103618732A (zh) * | 2013-12-05 | 2014-03-05 | 用友软件股份有限公司 | 一种PaaS与Erlang App应用引擎架构执行流程 |
CN103746855A (zh) * | 2014-01-27 | 2014-04-23 | 华为技术有限公司 | 电信云中异常事件的处理方法及装置 |
CN104899007A (zh) * | 2015-06-15 | 2015-09-09 | 华中科技大学 | 利用Xeon Phi协处理器提升布隆滤波器处理性能的系统及方法 |
CN105701020A (zh) * | 2014-11-28 | 2016-06-22 | 华为技术有限公司 | 一种内存访问的方法、相关装置和系统 |
WO2016202001A1 (zh) * | 2015-06-17 | 2016-12-22 | 华为技术有限公司 | 计算机指令处理方法、协处理器和系统 |
CN107133099A (zh) * | 2017-04-25 | 2017-09-05 | 深圳大数点科技有限公司 | 一种云计算方法 |
WO2018006696A1 (zh) * | 2016-07-04 | 2018-01-11 | 中兴通讯股份有限公司 | 均衡板卡内存利用率的板卡、方法和系统 |
CN109491788A (zh) * | 2018-11-01 | 2019-03-19 | 郑州云海信息技术有限公司 | 一种虚拟化平台负载均衡实现方法及装置 |
CN112527545A (zh) * | 2020-12-04 | 2021-03-19 | 厦门极致互动网络技术股份有限公司 | 一种Erlang进程超时管理方法 |
CN114610472A (zh) * | 2022-05-09 | 2022-06-10 | 上海登临科技有限公司 | 异构计算中多进程管理方法及计算设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101727351A (zh) * | 2009-12-14 | 2010-06-09 | 北京航空航天大学 | 面向多核平台的虚拟机监控器非对称调度器及其调度方法 |
CN101901207A (zh) * | 2010-07-23 | 2010-12-01 | 中国科学院计算技术研究所 | 异构共享存储多处理机系统的操作系统及其工作方法 |
-
2013
- 2013-05-17 CN CN201310184628.7A patent/CN103294540B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101727351A (zh) * | 2009-12-14 | 2010-06-09 | 北京航空航天大学 | 面向多核平台的虚拟机监控器非对称调度器及其调度方法 |
CN101901207A (zh) * | 2010-07-23 | 2010-12-01 | 中国科学院计算技术研究所 | 异构共享存储多处理机系统的操作系统及其工作方法 |
Non-Patent Citations (1)
Title |
---|
JIANRONG ZHANG: "Characterizing the Scalability of Erlang", 《HTTP://URN.KB.SE/RESOLVE?URN=URN:NBN:SE:KTH:DIVA-29122》, 12 May 2011 (2011-05-12) * |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103618732A (zh) * | 2013-12-05 | 2014-03-05 | 用友软件股份有限公司 | 一种PaaS与Erlang App应用引擎架构执行流程 |
CN103618732B (zh) * | 2013-12-05 | 2017-05-03 | 用友网络科技股份有限公司 | 一种PaaS与Erlang App应用引擎架构执行流程 |
CN103746855A (zh) * | 2014-01-27 | 2014-04-23 | 华为技术有限公司 | 电信云中异常事件的处理方法及装置 |
WO2015109955A1 (zh) * | 2014-01-27 | 2015-07-30 | 华为技术有限公司 | 电信云中异常事件的处理方法及装置 |
US10187181B2 (en) | 2014-01-27 | 2019-01-22 | Huawei Technologies Co., Ltd. | Method and device for handling exception event in telecommunication cloud |
CN105701020B (zh) * | 2014-11-28 | 2018-11-30 | 华为技术有限公司 | 一种内存访问的方法、相关装置和系统 |
CN105701020A (zh) * | 2014-11-28 | 2016-06-22 | 华为技术有限公司 | 一种内存访问的方法、相关装置和系统 |
CN104899007A (zh) * | 2015-06-15 | 2015-09-09 | 华中科技大学 | 利用Xeon Phi协处理器提升布隆滤波器处理性能的系统及方法 |
CN104899007B (zh) * | 2015-06-15 | 2017-08-01 | 华中科技大学 | 利用Xeon Phi协处理器提升布隆滤波器处理性能的系统及方法 |
CN106325819B (zh) * | 2015-06-17 | 2019-08-02 | 华为技术有限公司 | 计算机指令处理方法、协处理器和系统 |
CN106325819A (zh) * | 2015-06-17 | 2017-01-11 | 华为技术有限公司 | 计算机指令处理方法、协处理器和系统 |
WO2016202001A1 (zh) * | 2015-06-17 | 2016-12-22 | 华为技术有限公司 | 计算机指令处理方法、协处理器和系统 |
US10514929B2 (en) | 2015-06-17 | 2019-12-24 | Huawei Technologies Co., Ltd. | Computer instruction processing method, coprocessor, and system |
WO2018006696A1 (zh) * | 2016-07-04 | 2018-01-11 | 中兴通讯股份有限公司 | 均衡板卡内存利用率的板卡、方法和系统 |
CN107133099B (zh) * | 2017-04-25 | 2018-08-03 | 深圳大数点科技有限公司 | 一种云计算方法 |
CN107133099A (zh) * | 2017-04-25 | 2017-09-05 | 深圳大数点科技有限公司 | 一种云计算方法 |
CN109491788A (zh) * | 2018-11-01 | 2019-03-19 | 郑州云海信息技术有限公司 | 一种虚拟化平台负载均衡实现方法及装置 |
CN112527545A (zh) * | 2020-12-04 | 2021-03-19 | 厦门极致互动网络技术股份有限公司 | 一种Erlang进程超时管理方法 |
CN114610472A (zh) * | 2022-05-09 | 2022-06-10 | 上海登临科技有限公司 | 异构计算中多进程管理方法及计算设备 |
CN114610472B (zh) * | 2022-05-09 | 2022-12-02 | 上海登临科技有限公司 | 异构计算中多进程管理方法及计算设备 |
Also Published As
Publication number | Publication date |
---|---|
CN103294540B (zh) | 2014-05-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103294540B (zh) | 一种通过至强融核协处理器提升Erlang虚拟机性能的方法 | |
US11159605B2 (en) | Hierarchical dynamic scheduling | |
CN101452406B (zh) | 一种对操作系统透明的机群负载平衡方法 | |
US8230432B2 (en) | Defragmenting blocks in a clustered or distributed computing system | |
US20220174130A1 (en) | Network attached memory using selective resource migration | |
CN102866918B (zh) | 面向分布式编程框架的资源管理系统 | |
KR102103596B1 (ko) | 계산 작업을 처리하기 위한 컴퓨터 클러스터 장치 및 이를 작동시키기 위한 방법 | |
Tripathy et al. | Scheduling in cloud computing | |
US20080162625A1 (en) | Apparatus for end-user transparent utilization of computational, storage, and network capacity of mobile devices, and associated methods | |
CN101013415A (zh) | 用于多处理器阵列的线程感知分布式软件系统 | |
CN107491340B (zh) | 跨物理机的巨型虚拟机实现方法 | |
CN117480494A (zh) | 改进虚拟计算环境中资源分配的协调容器调度 | |
CN105242872A (zh) | 一种面向虚拟集群的共享存储系统 | |
CN114327926A (zh) | 一种异构边缘智能微服务器及其搭建方法 | |
EP3042305A1 (en) | Selective resource migration | |
WO2015034508A1 (en) | Hierarchical dynamic scheduling | |
CN107528871A (zh) | 存储系统中的数据分析 | |
CN111459871A (zh) | 一种基于fpga异构计算的区块链加速系统及方法 | |
CN109558214B (zh) | 异构环境下宿主机资源管理方法、装置和存储介质 | |
CN112416538B (zh) | 一种分布式资源管理框架的多层次架构和管理方法 | |
US20240160487A1 (en) | Flexible gpu resource scheduling method in large-scale container operation environment | |
CN113934525A (zh) | 一种基于正负反馈负载调度算法的Hadoop集群任务调度方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20140514 Termination date: 20150517 |
|
EXPY | Termination of patent right or utility model |