一种分布式系统中提高多核CPU处理能力的方法转让专利

申请号 : CN200710130560.9

文献号 : CN101349974B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 周海山童小九刘忱杨骐

申请人 : 中兴通讯股份有限公司

摘要 :

本发明公开了一种分布式系统中提高多核CPU处理能力的方法,其特征在于,包括步骤:(1)根据每一个CPU的节点确定功能节点数目、功能节点类型和功能节点标识,并录入数据库表或者配置文件中;(2)所述系统的控制模块根据上述内容创建至少一个应用进程,检测出退出的应用进程,并重新创建应用进程,所述应用进程运行与功能节点类型相应的应用程序;(3)对所述系统中原有的功能节点标识的获取方法修改为在应用进程入口直接读取传入参数。本发明解决了在保持现有分布式软件结构基本不变的前提下如何充分发挥多核CPU的性能来提高分布式系统处理能力的问题。

权利要求 :

1.一种分布式系统中提高多核CPU处理能力的方法,其特征在于,包括以下步骤:(1)根据每一个CPU的节点确定功能节点数目、功能节点类型和功能节点标识,并录入数据库表或者配置文件中;

(2)所述系统的控制模块根据上述内容创建至少一个应用进程,所述应用进程运行与功能节点类型相应的应用程序,系统的控制模块检测出退出的应用进程,并重新创建应用进程,所述重新创建应用进程运行与退出的应用进程的功能节点类型对应的应用程序;

(3)对所述系统中原有的功能节点标识的获取方法修改为在应用进程入口直接读取传入参数。

2.如权利要求1所述的方法,其特征在于,所述步骤(2)包括:

(21)所述系统的控制模块根据CPU的物理地址查询数据库表或者配置文件获得需要创建的功能节点数目、每一个功能节点的类型以及每一个功能节点的节点标识;

(22)根据每一个功能节点标识和系统原有的算法确定这每一个节点标识对应的每一个通讯地址,然后把这每一个通讯地址添加到该CPU节点中;

(23)创建至少一个应用进程,每个应用进程运行与功能节点类型相应的应用程序,并把每一个功能节点标识通过参数传递分配给对应的每一个应用进程,同时,建立一张进程ID和功能节点标识与功能节点类型对应表;

(24)检测创建的每个应用进程,如发现某个应用进程退出,则查询该应用进程ID和功能节点标识与功能节点类型对应表以确定退出的应用进程的功能节点标识和功能节点类型,然后重新创建一个应用进程,运行与此功能节点类型对应的应用程序并把此功能节点标识传给重新创建的应用进程,同时更新应用进程ID和功能节点标识与功能节点类型对应表。

3.如权利要求1所述的方法,其特征在于,所述步骤(1)中进一步包括:

所述每一个CPU节点上配置的功能节点数目可以大于该CPU包含的核数目,并且可以在一个CPU节点上同时配置不同类型的功能节点。

4.如权利要求1所述的方法,其特征在于,步骤(2)中所述系统的控制模块根据上述内容创建至少一个应用进程,为系统的控制模块根据上述内容利用fork创建至少一个应用进程。

5.如权利要求1所述的方法,其特征在于,所述步骤(3)为,对所述系统中原有的功能节点标识的获取方法修改为在应用进程入口main函数直接读取传入参数,然后把入参转化为功能节点标识。

6.如权利要求1所述的方法,其特征在于,所述步骤(3)中进一步包括:根据所述系统原有算法,不同的功能节点类型相应的应用程序会使用与自己的功能节点标识对应的通讯地址和其它功能节点进行通信。

7.如权利要求2所述的方法,其特征在于,所述步骤(24)中进一步包括:所述系统的控制模块重复执行这一过程。

8.如权利要求1所述的方法,其特征在于,所述CPU的节点,为物理CPU的节点。

说明书 :

一种分布式系统中提高多核CPU处理能力的方法

技术领域

[0001] 本发明涉及分布式系统领域,尤其是涉及使用多核CPU作为处理节点的分布式系统领域。

背景技术

[0002] 随着应用需求的不断增加,单个CPU的处理能力已经远远不能满足要求,取而代之,分布式系统由于其强大的处理能力和良好的扩展性,正在发挥着越来越重要的作用。例如,由于需要同时支持大量的用户,电信领域的核心网设备和基站设备都采用了分布式系统方案来实现。介绍两个概念:分布式系统的CPU节点和分布式系统的功能节点。分布式系统的CPU节点指的是组成分布式系统的各个CPU。而分布式系统的功能节点指的是一个软件实体,软件实体驻留在CPU节点之上,所有的软件实体通过协作共同完成分布式系统的功能。
[0003] 理想情况下,由N个相同CPU组成的分布式系统,其处理能力应该是单个CPU运算能力的N倍。实际系统中,由于通信等开销,分布式系统的处理能力还达不到单个CPU运算能力的N倍。但是,对于一个具有良好扩展性的分布式系统,其系统处理能力应该与CPU的数目成线性关系。假设单个CPU的运算能力是C,系统由N个CPU组成,那么一个具有良好扩展性的分布式系统的处理能力为:N×k×C,其中k为与系统设计相关常数,一般小于1。 [0004] 显然,增大N或者提高C,都可以提高具有良好扩展性的分布式系统的处理能力。实际应用中,这两种方法都经常被用来提高系统的处理能力。在提高CPU运算能力方面,由于受到工艺和主频等限制,提高单个CPU核的运算能力变得越来越困难。目前各芯片厂商的普遍做法是在一块芯片 上集成多个CPU核,即多核CPU,以提高CPU的运算能力。多核CPU是未来的发展趋势。
[0005] 多核CPU本质上属于对称共享存储器多处理器架构(SMP)。支持SMP架构的操作系统如linux、UNIX等,这些现代操作系统都支持多线程编程,在SMP架构上多个线程可以被操作系统调度到不同的处理器或者CPU核上同时运行,实现真正的并发。对于一个n核的CPU,其实际的处理能力不仅取决于n的大小,更取决于应用程序的并行度,即构成应用程序的工作线程数目m。只有线程数目m足够多,操作系统才能保持底层的所有CPU核都处于调度运行状态,多核CPU的运算能力才能充分发挥。因此,为了提高多核CPU的处理能力,必须提高应用程序的并行度,即增加应用程序的工作线程数目。
[0006] 但是,现在的情况经常是,即使对于一个具有良好扩展性的分布式系统来说,其单个CPU节点上运行的应用程序的并行度可能较低,即真正工作的线程数目非常少,因此无法充分挖掘多核CPU节点的运算能力,即多核CPU的处理能力并不高,从而无法达到提高整个分布式系统的处理能力的目的。那么如何挖掘分布式系统中多核CPU节点的运算能力呢?或者说如何提高多核CPU的处理能力呢?
[0007] 显然,提高单个CPU节点上运行程序的并行度可以解决这个问题。这需要修改现有的应用软件,尽可能使用多线程的方式提高其并行度。对于大型的分布式系统软件,如复杂的电信设备软件,软件修改量将是巨大的,而且多线程编程的难度要远远大于串行编程。因此,对于现有的大型的分布式系统软件来说,这个方法并不总是可行。 [0008] 在保持现有分布式系统软件不作较大改动的条件下,如何提高分布式系统中多核CPU节点的处理能力呢?有人提出了多核拆分的解决方法,即把每一个核当作一个独立的CPU节点,一个多核CPU节点被拆分成相互独立的多个CPU节点。这种方法实际上变相增加了分布式系统中的节点数N,因而提高了整个系统的处理能力。此方法要求每个CPU核运行自己的操作系统。为了实现这一点需要操作系统做很多特殊处理,也就是说需要操作系统厂商进行定制,或者通过增加一层特殊中间软件,然后在中间软件之上运行多个操作系统。
其次,每个核上都要驻留操作系统映像,必然会增加内存的开销。另外,由于底层设备可能只在某个核上才能访问,因此必然会影响上层应用软件操作的透明性。 发明内容
[0009] 本发明所解决的技术问题在于提供一种分布式系统中提高多核CPU处理能力的方法,以解决在保持现有分布式软件结构基本不变的前提下如何充分发挥多核CPU的性能来提高分布式系统处理能力的问题。
[0010] 为了解决上述问题,本发明提供了一种分布式系统中提高多核CPU处理能力的方法,其中,包括以下步骤:
[0011] (1)根据每一个CPU的节点确定功能节点数目、功能节点类型和功能节点标识,并录入数据库表或者配置文件中;
[0012] (2)所述系统的控制模块根据上述内容创建至少一个应用进程,所述应用进程运行与功能节点类型相应的应用程序,系统的控制模块检测出退出的应用进程,并重新创建应用进程,所述重新创建应用进程运行与退出的应用进程的功能节点类型对应的应用程序;
[0013] (3)对所述系统中原有的功能节点标识的获取方法修改为在应用进程入口直接读取传入参数。
[0014] 本发明所述的方法,其中,所述步骤(2)包括:
[0015] (21)所述系统的控制模块根据CPU的物理地址查询数据库表或者配置文件获得需要创建的功能节点数目、每一个功能节点的类型以及每一个功能节点的节点标识; [0016] (22)根据每一个功能节点标识和系统原有的算法确定这每一个节点标识对应的每一个通讯地址,然后把这每一个通讯地址添加到该CPU节点中;
[0017] (23)创建至少一个应用进程,每个应用进程运行与功能节点类型相应的应用程序,并把每一个功能节点标识通过参数传递分配给对应的每一个应用进程,同时,建立一张进程ID和功能节点标识与功能节点类型对应表;
[0018] (24)检测创建的每个应用进程,如发现某个应用进程退出,则查询该应用进程ID和功能节点标识与功能节点类型对应表以确定退出的应用进程的功能节点标识和功能节点类型,然后重新创建一个应用进程,运行与此功能节点类型对应的应用程序并把此功能节点标识传给重新创建的应用进程,同时更新应用进程ID和功能节点标识与功能节点类型对应表。
[0019] 本发明所述的方法,其中,所述步骤(1)中进一步包括:
[0020] 所述每一个CPU节点上配置的功能节点数目可以大于该CPU包含的核数目,并且可以在一个CPU节点上同时配置不同类型的功能节点。
[0021] 本发明所述的方法,其中,步骤(2)中所述系统的控制模块根据上述内容创建至少一个应用进程,为系统的控制模块根据上述内容利用fork创建至少一个应用进程。 [0022] 本发明所述的方法,其中,所述步骤(3)为,对所述系统中原有的功能节点标识的获取方法修改为在应用进程入口main函数直接读取传入参数,然后把入参转化为功能节点标识。
[0023] 本发明所述的方法,其中,所述步骤(3)中进一步包括:根据所述系统原有算法,不同的功能节点类型相应的应用程序会使用与自己的功能节点标识对应的通讯地址和其它功能节点进行通信;
[0024] 其中,所述步骤(24)中进一步包括:所述系统的控制模块重复执行这一过程。 [0025] 本发明所述的方法,其中,所述CPU的节点,为物理CPU的节点。 [0026] 本发明与现有技术相比,本发明提高了分布式系统中多核CPU的处理能力,在几乎不改变现有分布式系统软件架构的前提下,运用本发明使得采用多核CPU节点替换单核CPU节点来提升分布式系统处理能力的想法变得实际可行;另外,本发明打破了分布式系统中物理CPU节点和功能节点之间一一对应关系,每个物理CPU节点之上可以驻留一个或多个功能节点,这些功能节点的类型可以相同也可以不同,从而方便了分布式系统的设计。 [0027] 附图说明
[0028] 图1是本发明的分布式系统的物理CPU节点连接示意图;
[0029] 图2是本发明实施例中数据库表结构设计示意图;
[0030] 图3是本发明实施例所述的图1中A、B、C在数据库中配置的数据示意图; [0031] 图4是本发明实施例所述步骤中的进程pid和节点标识对应关系示意图; [0032] 图5是本发明实施例所述的一种分布式系统中提高多核CPU处理能力的方法大致流程图;
[0033] 图6是本发明实施例所述第二步的控制模块处理流程示意图。

具体实施方式

[0034] 本发明的目的是介绍一种分布式系统中提高多核CPU处理能力的方法,以解决在保持现有分布式软件结构基本不变的前提下如何充分发挥多核CPU的性能来提高分布式系统处理能力的问题。以下对具体实施方式进行详细描述,但不作为对本发明的限定。 [0035] 本发明大致思想在于提出了另外一种解决方法:多核CPU之上仍然运行一个SMP操作系统,在操作系统之上创建多个进程,每个进程运行相同或者不同的应用程序,每个应用进程对外都表现为分布式系统中的一个功能节点,相当于增加了分布式系统中的功能节点数目。对操作系统来说,多个应用进程的并发运行,意味着工作线程数目的增多,因而提高了多核CPU的处理能力。而对于该分布式系统来说,本发明增加了系统中的功能节点数目,因而提高整个分布式系统的处理能力。
[0036] 本发明通过在SMP操作系统之上创建多个运行相同或者不同应用程序的进程,每个进程对外都表现为分布式系统中的一个功能节点,增加了分布式系统中的功能节点数目,提高了分布式系统的处理能力。本质上,本发明是把多核CPU强大的处理能力转化为分布式系统中功能节点的增 加,而CPU节点数目保持不变。而背景技术中的多核拆分方法是把多核CPU拆分成多个CPU节点,增加了CPU节点的数目,功能节点数目随之增加。但是本发明克服了多核拆分方法的缺点,首先本发明不需要操作系统厂商的定制或者附加额外的中间软件,因为任何一款通用多核CPU的推出,基本上会支持主流的操作系统;其次,多核CPU之上只运行一个SMP操作系统映像,减少了内存开销;另外,由于只运行一个SMP操作系统映像,因此不再存在上层软件访问设备的透明性问题。
[0037] 对于一个分布式系统,每个功能节点都有自己唯一的标志,系统需要使用一种方法能够知道系统内到底配置了哪些功能节点;系统内的各功能节点之间可以相互通讯,对于上层软件来说,能够把消息发送到目的节点的唯一条件就是给出目的功能节点的标志。为此,系统必须建立一张功能节点标识和通讯地址对应表,常见的通讯地址包括IP地址、以太网地址等。
[0038] 商用的分布式系统设备,如电信设备,一般都是由多个机框组成,每个机框包括很多插槽,各CPU节点以单板形式插入不同槽位并和机框背面的背板相连,背板提供电源、以太网连接和其它一些信号线。另外,一块单板上可以存在多个物理CPU节点,不同CPU使用物理CPU号区分。因此,每个CPU节点都有自己的物理地址:框号、槽位号和物理CPU号,为了描述方便,只取槽位号和物理CPU号作为物理地址。很多分布式系统直接使用CPU的物理地址作为功能节点的标识,这是因为这些分布式系统的一个CPU节点上只驻留一个功能节点。
[0039] 分布式系统中各CPU节点之间一般通过局域网进行连接。附图1给出了一个分布式系统的物理CPU节点连接示意图。CPU节点A的物理地址为:1槽位的1号CPU,即(1,1);CPU节点B的物理地址为:1槽位的2号CPU,即(1,2);CPU节点C的物理地址为:2槽位的1号CPU,即(2,1);CPU节点A和CPU节点B位于相同槽位的一块单板上。 [0040] 本发明申请的主要特征包括以下处理步骤:
[0041] 步骤501,初始的数据配置过程;
[0042] 步骤502,控制模块的处理过程;
[0043] 步骤503,原有系统中获取本功能节点标识的方法需要修改。
[0044] 所述的步骤501中,需要把系统中所有的功能节点都配置到数据库中或者一个配置文件中,通过配置系统才能够知道存在哪些功能节点;
[0045] 每一个物理CPU节点,首先需要确定实际驻留的功能节点数目n(n大于等于1)和每一个功能节点的类型,每一个功能节点由运行在该CPU节点上一个应用进程来表示;其中,功能节点的类型决定了应用进程运行的应用程序。然后需要为每一个功能节点分配节点标识。最后把功能节点数目、功能节点类型和功能节点标识录入数据库表中或者配置文件中;
[0046] 实际应用中,对于单核CPU节点,一般n等于1,即一个单核CPU节点上一般只驻留一个功能节点;对于多核CPU节点,为了提高多核CPU的处理能力,n一般大于1,即一个多核CPU节点对外表现为多个功能节点。但是,允许在一个CPU节点上配置的功能节点数目大于该CPU包含的核数目,并且允许在一个CPU节点上同时配置不同类型的功能节点。 [0047] 所述的步骤502中,各CPU节点的操作系统首先以管理员身份运行控制模块进程,控制模块进程以CPU的物理地址查询数据库或者配置文件获得需要创建的功能节点数目n、每一个功能节点的类型以及n个功能节点的节点标识;
[0048] 根据n个功能节点标识和系统原有的算法确定这n个节点标识对应的n个通讯地址,然后把这n个通讯地址添加到该CPU节点中;
[0049] 创建n个应用进程,每个应用进程运行与功能节点类型相应的应用程序(此应用程序须经过步骤3做少量修改),并把n个功能节点标识通过参数传递分配给对应的每一个应用进程;同时,建立一张进程ID和功能节点标识与功能节点类型对应表;每个进程运行的应用程序由其代表的功能节点类型决定,代表相同类型功能节点的应用进程运行相同的应用程序,代表不同类型功能节点的应用进程运行不同的应用程序;
[0050] 检测创建的n个应用进程,如果发现某个应用进程退出,则查询进程ID和功能节点标识与功能节点类型对应表以确定退出进程的功能节点标识和功能节点类型,然后重新创建一个应用进程运行与此功能节点类型对应的应用程序并把此功能节点标识传给它,同时更新进程ID和功能节点标识与功能节点类型对应表。重复执行这一过程。
[0051] 所述步骤503中,原有应用软件获取本功能节点标识的方法需要修改。上述步骤502中,控制模块在创建功能节点时已经把功能节点标识以参数形式传入,因此本功能节点标识的获取改为在应用进程入口直接读取传入参数。根据系统原有算法,不同的功能节点(应用进程)会使用与自己的节点标识对应的通讯地址和其它功能节点进行通信。 [0052] 经过上述步骤的处理,多核CPU上的每一个应用进程对外都完全表现为分布式系统中的一个功能节点。
[0053] 上面是本发明的基本原理,在不同的操作系统和不同的分布式系统上的实现可能有些细节差异,但基本原理、基本思想是一致的。
[0054] 为了描述方便,下面的实施例里给出一些约定。一是假设分布式系统中所有功能节点的类型都是相同的,即代表功能节点的应用进程运行相同的应用程序,因此进程ID和功能节点标识与功能节点类型对应表就简化为进程ID和功能节点标识对应表;二是数据配置是通过数据库表进行配置的,并且数据库表的设计如图2所示,其中物理的槽位号和物理的CPU号为关键字,对于每个物理CPU,需要配置有效的功能节点数目n和每个功能节点的逻辑CPU号,另外,图2中约定最多可配置6个功能节点;三是功能节点标识由槽位号和逻辑CPU号构成;四是功能节点之间使用IP地址进行通讯。需要说明的是这些约定仅仅是为了更加清楚的描述实施步骤,发明内容本身并不需要强加这些约定。 [0055] 以下结合附图,在linux操作系统上对本发明的具体实施进行详细说明。 [0056] 下面的描述中仅包括与本发明相关的实施步骤,对于实现一个分布式系统的其它必不可少的步骤,由于与本发明无关,说明中没有介绍。
[0057] 第一步,初始的数据配置过程的实施步骤如下:
[0058] 结合附图1,下面描述物理CPU节点A、B和C在数据库表中是如何配置的。假设图1中,CPU节点A是具有4个核的CPU,CPU节点B是具有2个核的CPU,CPU节点C是单核CPU。
[0059] 对于CPU节点A,假设需要驻留3个功能节点,即有效的功能节点数目为3个。同时为这3个功能节点分配逻辑CPU号,分别为1、2、3。按照上述约定,这些功能节点的节点标识分别为(1,1)、(1,2)、(1,3)。
[0060] 对于CPU节点B,假设需要驻留2个功能节点,即有效的功能节点数目为2个。同时为这2个功能节点分配逻辑CPU号,分别为4、5。按照上述约定,这些功能节点的节点标识分别为(1,4)、(1,5)。
[0061] 对于CPU节点C,是一个单核CPU,假设只需要驻留1个功能节点,即有效的功能节点数目为1个。同时为这1个功能节点分配逻辑CPU号,为1。按照上述约定,此功能节点的节点标识为(2,1)。
[0062] 针对图1中的A、B、C三个物理CPU节点,最终数据库表中录入的数据,如图3所示。
[0063] 第二步,控制模块的处理过程的实施步骤如下:
[0064] 结合附图6,下面描述控制模块的具体实施步骤。
[0065] 见附图6的步骤601,修改操作系统的启动配置文件,使得各CPU节点的操作系统起来后能够自动运行控制模块进程。比如控制模块的可执行文件位于/home/user/MainControl,那么在/etc/rc.local文件最后添加一行:/home/user/MainControl。 [0066] 见图6的步骤602,控制模块进程调用系统接口获取本CPU节点的物理地址。 [0067] 见图6的步骤603,控制模块进程以CPU的物理地址查询数据库获得需要创建的功能节点数目n以及n个功能节点的节点标识。以物理CPU节点A为例,控制模块进程用物理地址(1,1)查询数据库,查询结果为:有效功能节点数目为3个,3个功能节点的逻辑CPU号为1、2、3, 即要创建的功能节点数目为3个,3个功能节点的标识为(1,1)、(1,2)、(1,3)。
[0068] 见图6的步骤604,控制模块进程根据n个功能节点标识和系统计算IP地址的算法计算出n个IP地址,然后把这n个IP地址添加到物理CPU节点中。
[0069] 见图6的步骤605,控制模块进程用fork创建n个子进程,每个子进程运行execl功能节点应用程序,并把节点标识以execl的参数形式传入每一个子进程。同时需要本地创建一张表来保存各子进程pid和功能节点标识的对应关系。以CPU节点A为例,3个子进程pid和3个功能节点标识的对应关系,如图4所示。
[0070] 见图6的步骤606,控制模块进程通过wait系统调用来监测各子进程(正常退出或者异常退出),wait返回的是退出子进程的pid。
[0071] 见图6的步骤607,用退出子进程的pid查询子进程pid和功能节点标识对应关系表,得到退出子进程的功能节点标识。
[0072] 见图6的步骤608,重新fork一个子进程,该子进程execl功能节点应用程序,并把此功能节点标识以参数形式传入该子进程,同时更新子进程pid和功能节点标识对应关系表。
[0073] 跳转到图6的步骤606。
[0074] 第三步,原有系统中功能节点应用程序的修改步骤如下:
[0075] 原有应用软件获取本功能节点标识的方法需要修改。在控制模块进程创建子进程时已经把功能节点标识以参数形式传入,因此本功能节点标识的获取改为在应用进程入口main函数直接读取传入参数,然后把入参转化为功能节点标识。原有系统中功能节点应用程序不再需要做其它任何改动。
[0076] 本发明专利通过在一个多核CPU上运行多个应用进程的方式,提高了多核CPU的处理能力,增加了分布式系统中的功能节点数目,因而提高了分布式系统的处理能力。 [0077] 本发明的实施例所述的内容提高了分布式系统中多核CPU的处理能力。在几乎不改变现有分布式系统软件架构的前提下,运用本发明使得采用多核CPU节点替换单核CPU节点来提升分布式系统处理能力的想法变得实际可行;另外,本发明打破了分布式系统中物理CPU节点和功能节点之间一一对应关系,每个物理CPU节点之上可以驻留一个或多个功能节点,这些功能节点的类型可以相同也可以不同,从而方便了分布式系统的设计。 [0078] 当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员可根据本发明做出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。