专利名称:线程池容量自适应调节方法及应用服务器并发控制方法
技术领域:
本发明涉及一种线程池容量自适应调节方法,以及一种应用服务器并发控制方法,尤 其涉及一种通过非侵入的方式实现应用服务器并发控制并提供自适应的并发控制能力的 方法,属于软件技术领域。
背景技术:
应用服务器是面向Web计算环境的主流中间件平台,它为企业级应用的开发、部署、 运行、集成和管理提供了良好的支撑平台。作为Web计算环境下产生的新一代中间件,应 用服务器解决了中间件在面向Internet的Web计算环境下遇到的问题,不仅具有传统事务监 控器的高可伸縮性、高可用性、高可靠性和高效等高级特性,而且为事务性Web应用提供 一个跨平台的运行环境、 一系列通用服务以及相应的工具集。
应用服务器需要处理多用户的请求调用,是典型的并发处理环境,利用请求并发执行 的处理方式可以减少处理器的闲置时间,增加服务器吞吐量。并发是指两个或者多个事件 在同一时间间隔内发生,在单处理器单核环境下,多道程序交替执行,在微观上是交替和 顺序的,在宏观上,在一段时间间隔内是同时的,称之为并发程序。在多核、多CPU、或 者开放的分布式计算环境下,并发程序在多个处理器上同一时刻运行,则可称之为并行程 序。
并发程序的开发需要遵循一定的并发控制模型,目前应用服务器主要采用线程/锁 (Threads and Locks)模型(参见文献Doug Lea, Douglas Lea, Concurrent Programming in Java. Second Edition: Design Principles and Patterns, Addison-Wesley Longman Publishing Co.,Inc.,Boston,MA,1999),即通过多线程处理多用户请求。在该模型下,应用服务器往往 通过线程池模式(请参见中国发明专利公开号说明书CN200410050035.2A)对并发资源(线 程)进行重复利用,以节省线程在创建和销毁时的服务器性能损耗,同时对并发资源加以 约束,防止由于线程不受限的增加而造成的系统性能下降。
目前,并发控制模型仍存在易用性问题,尽管线程/锁模型是目前最广为使用的并发控 制模型,但它仍是一个复杂的模型,应用服务器的开发人员需考虑包括线程的分配时机、 并发任务的计划和安排、锁粒度的控制等问题。总而言之,对于习惯于串行编程的开发人
员而言,并发编程是一项具有挑战性的工作,而对于开发应用服务器这类复杂系统,其难 度之大更是一般开发人员无法胜任。
Rachid (Rachid Guerraoui, A Smooth Concurrency Revolution with Free Objects, IEEE Internet Computing, vol.11 , no.4, 2007, pp.82-85)提出Free Objects概念,即通过扩展面 向对象编程范式实现隐式并发编程,进而降低并发程序的开发复杂度。Rachid的方法可归 结为主动对象模式(R.Greg Lavender, Douglas C. Schmidt, Active object: an object behavioral pattern for concurrent programming, Pattern languages of program design 2, Addison-Wesley Longman Publishing Co., Inc., Boston, MA, 1996)的一种面向对象实现,在继承面向对 象编程范式特征(封装性、继承性、多态性)的同时,实现串行面向对象程序向并发程序 的自然转换。以FreeObjects为代表的隐式并发编程是未来并发编程技术发展的趋势,但与 以往的并发控制模型相比,该类方法仍是一种侵入式的实现方式,即系统与并发控制模型 之间存在耦合。
面向方面编程(Aspect oriented programming, AOP)技术(R. E. Filman, T. Elrad, S. Clarke: M. Aksit. Aspect-Oriented Software Development. Addison-Wesley, 2004.)为解决上述耦合问 题提供了可能,该技术旨在解决跨越多级无关联对象模型的公共行为模块化问题。具有横 切特性的耦合点被称为"横切关注点"(crosscutting concerns)。 AOP通过定义切入点 (pointcut)来描述系统"横切关注点",通过定义通知(advice)实现横切特性的逻辑功能, 并将非业务功能模块以"方面(aspect)"的形式切入贯穿的无关的对象模型,在更高的抽象 和分解层次上实现解耦。J&g和Rachid (J6rg Kienzle and Rachid Guerraoui, AoP —doesit make sense the case of concurrency and failures. In 16th European Conference on Object Oriented Programming (ECOOP 2002), Lecture Notes in Computer Science 2374, Springer Verlag,pages 37-54, 2002)针对如何利用AOP技术实现并发控制进行了探讨,但他们的工 作侧重于具有事务性的并发行为。
除了上述易用性问题,并发资源管理模式还存在自适应性问题。由于网络环境下用户 行为存在不确定性,因此应用服务器作为Internet环境下信息服务的运行支撑平台,其并 发资源的管理存在动态调整的需求,并且需要综合考虑系统运行的硬件环境、用户访问的 负载特征等多种因素。这一问题本质上是系统配置的优化问题。目前,管理人员往往需要 面对复杂的系统配置、性能优化等问题,按照信息系统的发展趋势,即使是经验丰富、技 术熟练的管理人员也无法应对下一代信息系统的复杂性,另一方面,系统部署量的增长也 将造成可胜任的管理人员的短缺。为解决这一位问题,Kephart(Kephart, J., Chess, D., The
vision of autonomic computing. IEEE Comput. 36(1), 41-50 2003)提出自主计算的概念,自主 系统参照自主神经系统的自我调节机制,具有自配置、自优化、自修复、自保护等自主特 征,使得信息系统在"整体上(holistic)"实现自我管理,最终实现系统管理成本的降低。
基于线程池的并发资源管理模式所存在的自适应性问题可以通过自主计算的相关技术 解决,但如何实现非自主系统向自主或半自主系统的转变仍是困扰系统开发人员的难题, 对于无法获得源代码的系统,无法在其基础上扩充自主系统的关键模块,而对于组件间耦 合度较高的系统,系统扩充工作也很困难。
发明内容
本发明的目的在于克服现有技术中存在的问题,提供一种线程池容量自适应调节方法 和一种非侵入式、自适应的应用服务器并发控制方法,将应用服务器与并发控制模型解耦, 同时为应用服务器提供自适应的并发控制机制。
为了达到上述技术目的,本发明采用如下技术方案
一种非侵入式、自适应的应用服务器并发控制方法,包括以下各步骤
1) 构造一个自适应并发控制系统;
2) 优选使用AOP编程工具(比如AspectO构造一个并发方面(Aspect)库,定义抽象并 发方面和抽象并发任务处理类;
3) 基于并发方面库和自适应并发控制系统,并根据应用服务器的具体需求进行并发 处理模块的开发;
4) 优选使用AOP编程工具(比如AspectJ)进行方面编织,将所述并发处理模块植入原 应用服务器系统,生成新的应用服务器系统。
上述非侵入式、自适应的应用服务器并发控制方法中,构造一个自适应并发控制系统 的方法为
1、 根据线程池模式构造一个线程池;
2、 利用爬山算法,构造一个自适应的线程池动态调整方案,其步骤包括
1) 预定义线程池容量的最小值、调整时间间隔和超长任务执行系数;
2) 在预定义的时间间隔内,测量线程池的使用情况包括测量线程池内所有活动线 程的执行时间(ThreadsUsedTime);统计所有完成任务执行的线程,得到的统计值称为线程 使用量;并记录任务完成数(CompletedTaskCount);
3) 根据上述步骤2)中所述活动线程的执行时间和任务完成数,计算 ThreadsUsedTime/CompletedTaskCount,即任务平均执行时间,然后将任务平均执行时间与 超长任务执行系数相乘,获得超长任务执行时间。超长任务执行时间表示任务执行时间过 长的任务,这一时间由超长任务执行系数和任务平均执行时间决定,并大于调整时间间隔。 接着统计活动线程执行时间小于超长任务执行时间的线程,称之为健康线程数。统计健康 线程数的目的是为了排除超长任务的干扰,更准确的预测下一时间间隔内线程资源的使用 量;
4) 根据上述步骤3)中的评估进行线程池容量的择优调整,若健康线程数大于线程 使用量,且等待队列不为空,则表示下一时间间隔内的线程需求可能大于目前的供给量, 将进入如下子步骤,否则进入步骤5);
(4.1) 记录上一时间间隔的健康线程数和任务完成数,并统计最大任务完成数及其 对应的健康线程数。记录上述数据的目的是为了给爬山算法进行择优调整提供依据;
(4.2) 利用爬山算法对步骤(4.1)记录的若干历史时间间隔数据进行线程池容量的 择优调整。所述爬山算法是一种经典的择优算法,可参见文献Stuart J. Russell, Peter Norvig, Artificial intelligence: a modern approach, Prentice-Hall, Inc., Upper Saddle River, NJ, 1995;
5) 判断是否进行下一时间间隔的自适应调整,若是则返回步骤2)继续进行动态调 整,否则自适应并发控制系统将终止运行。
上述非侵入式、自适应的应用服务器并发控制方法中,基于并发方面库并根据应用服
务器的具体需求进行并发处理模块开发的方法中包括以下步骤
1、 扩展抽象并发方面;其步骤包括
1) 根据应用服务器的具体需求切入点的定义和描述;
2) 定义around通知,对应用服务器的并发请求进行包装;
3) 将上述包装后的并发请求执行逻辑提交给自适应的并发控制系统执行。
2、 扩展抽象并发任务处理类,重载并发执行方法,根据应用服务器的具体需求进行相 应功能的增添。
和现有技术相比,本发明具有如下技术优势
1、 利用并发方面库实现应用服务器与并发控制模型的解耦,开发人员仅需对并发方 面进行扩展,从而降低了系统复杂度和开发、维护的难度。同时,由于并发控制模型与应 用服务器解耦,开发人员可以根据实际需求替换并发控制机制,提高了系统灵活性。
2、 利用自适应的并发控制机制,简化了应用服务器并发资源的管理和配置,优化了
应用服务器的性能。
3、本发明可为应用服务器的设计和开发提供支持,可应用于应用服务器中的组件容 器(Web容器、EJB容器等)的并发控制模块的设计和开发。
图l本发明中非侵入式、自适应的应用服务器并发控制方法流程图。 图2应用服务器植入自适应并发控制系统后处理客户端请求的示例图。 图3自适应线程池动态调整流程图。
图4利用AOP编程工具构造的并发方面库以及简单Java应用服务器相关的并发控制
模块示例图。
具体实施例方式
以下结合具体实施例和附图对本发明进行详细说明。
本实施例提出一种非侵入式、自适应的应用服务器并发控制方法。作为本实施例方法 的使用环境,所述应用服务器采用一个简单的Java应用服务器,其示例代码内容如代码l 所示
代码1:
1 cl鹏SimpleServer(
2 public void handleSocket(Socket s){
3 InputStream in = s.getlnputStread();
4 …〃处理socket连接
5 }
6 public void serverStart()(
7 socket = serverSocket.accept(》
8 handleSocket (socket)^
9 }
10 }
在上述代码l中,SimpleServer类实现了一个简单Java应用服务器,用以处理客户端的
Socket连接,它包含一个服务器启动方法(第6-9行)用以启动应用服务器,以及一个Socket 请求处理方法(第2-5行),服务器通过启动方法启动后对Socket端口进行监听(第7行), 并通过Socket请求处理方法对Socket请求进行处理(第8行)。
由于需要多个客户端的并发请求,因此需要利用并发控制模型对多个客户端的Socket 连接进行并发处理。目前应用服务器主要采用线程/锁模型,传统的侵入式方法(代码2) 需要利用该并发控制模型对简单Java应用服务器(代码l)进行重构,为每个Socket连接创 建一个线程,从而实现并发处理(第8-12行)。
代码2:
1class SimpleServer{
2 public void handleSocket (Socket s){
3 InputStream in = s.getInputStread();
4 …//处理socket连接
5 }
6 public void serverStartO{
7 socket = serverSocket.accept();
8 new Thread(new Runnable() {
9 public void run(){
10 handleSocket (socket);
11 }
12 }
13 }
14 }
本实施例方法则实现了应用服务器和并发控制模型之间的解耦,其流程如图l所示
1.在应用服务器中构造自适应并发控制系统,本实施例是针对线程池模式采用爬山算
法构造线程池的动态调整方案,其步骤包括
(1) 根据线程池模式构造一个线程池;
(2) 利用爬山算法,构造一个自适应的线程池动态调整方案,使该线程池具有自适应 的动态调整能力。
本实施例的自适应并发控制系统由资源监控器、资源评估器、资源管理器和线程池四 部分组成,是应用服务器并发资源管理的基础部分。其中,资源监控器负责线程池使用情
况的监测和数据统计;资源评估器负责进行线程池未来使用情况的评估和预测;资源管理 器负责线程池容量的动态调整;线程池负责对线程资源进行池化管理,其构造方法可参见 中国发明专利公开号说明书CN 200410050035.2A。图2是自适应并发控制系统植入应用服 务器后的请求处理示例图。
其中,上述步骤(2)所述构造自适应的线程池动态调整方案的流程,如图3所示 首先预定义线程池容量的最小值、调整时间间隔,在预定义的时间间隔内,测量线程 池内所有活动线程的执行时间,并针对任务执行结束的线程使用量进行统计,同时记录任 务完成数;根据活动线程执行时间和任务完成数,计算超长任务执行时间,统计活动线程 执行时间小于超长任务执行时间的线程,称之为健康线程数,并以此作为下一时间间隔内 线程池容量的评估依据,若健康线程数大于线程使用量,且等待队列不为空,则记录上一 时间间隔的健康线程数和任务完成数,并利用爬山算法进行线程池容量的择优调整,否则 不需调整。由于客户端的负载是随时变化的,因此上述调整过程将持续进行直至系统终止。 值得说明的是,本实施例采用爬山算法(:参见文献Stuart J. Russell , Peter Norvig, Artificial intelligence: a modern approach, Prentice-Hall, Inc., Upper Saddle River, NJ, 1995)构 造自适应线程池动态调整方案,是一种局部择优的方法,是对深度优先搜索的一种改进, 它利用反馈信息帮助生成解的决策。除此之外,还可以采用别的方式构造自适应的线程池 调整方案。
2.利用AOP编程工具构造一个并发方面库,定义抽象并发方面和抽象并发任务处理
类;
本实施例通过AOP编程工具AspectJ (Gregor Kiczales, Erik Hilsdale, Jim Hugunin, Mik Kersten, Jeffrey Palm, and William G. Griswold. An overview of Aspect! Lecture Notes in Computer Science,2072:327-355, 2001.)构造并发方面库,在该并发方面库中,定义了一个 抽象并发处理类(AbstractRequestHandleWork)用于处理客户请求的并发任务,以及一个 抽象并发方面(AbstractRequestHandlerAspect),用于声明抽象切入点,如图4所示。当然 采用其它的AOP编程工具也可以达到本发明目的。
其中,抽象并发处理类(AbstractRequestHandleWork)(代码3)利用Java语言中的线程 模型实现Runnable接口 (第l行),声明了一个抽象请求处理方法(第2行),并在并发运行 方法中给出了一个缺省的实现,即直接执行抽象请求处理方法(第3-5行)。
代码3:
1 public abstract class AbstractRequestHandleWork implements Runnable {
2 public abstract Object handleRequest();
3 public void run() {
4 handleRequest();
5 }
6 }
抽象并发方面(AbstractRequestHandlerAspect)(代码4)声明了一个抽象切入点用以 捕获请求处理(第2行)。
代码4:
1 public abstract aspect AbstractRequestHandlerAspect {
2 public abstract pointcut request();
3 }
3.基于并发方面库和自适应并发控制系统,根据应用服务器的具体需求进行并发处理 模块的开发;
如图4所示,针对上述简单Java应用服务器,本实施例基于并发方面库,定义了本实施 例简单Java应用服务器的相关并发处理模块,包括Socket处理任务类(SocketHandleWork), 用于在简单Java应用服务器中处理Socket连接的并发任务,以及Socket处理方面 (SocketHandlerAspect),用于根据简单Java应用服务器的具体情况,定义切入点,并定义通 知执行逻辑,实现对切入点的并发控制。
Socket处理任务类(SocketHandleWork)(代码5)继承了并发方面库中的抽象并发处理类 (AbstractRequestHandleWork),并在并发运行方法中给出了一个扩展实现(第3-7行),即 在执行抽象请求处理方法的前后增加上下文处理、生命周期管理以及监控等功能。
代码S:
1
2
4
public abstract Object handleRequest(); public void run() {
…〃处理上下文、生命周期管理、监控等
5 handleRequest();
6 …//处理上下文、生命周期管理、监控等
7 }
8 }
Socket处理方面(SocketHandlerAspect)(代码6)继承了并发方面库中的抽象并发方面 (AbstractRequestHandlerAspect),并针对简单Java应用服务器对抽象切入点进行了具体定 义(第2行),即对简单Java应用服务器的Socekt请求处理方法调用进行拦截。同时,定义 了通知,即在捕获到切入点时,对其方法调用进行包装(第3-8行),实现并发控制。在本 实施例中,通过具有自适应性的线程池来实现并发控制(第9、 IO行)。
代码6:
1 public aspect SocketHandlerAspect extends AbstractRequestHandlerAspect {
2 public pointcut request ():call(void SimpleServer.handleSocket());
3 Object around(): request (){
4 SocketHandleWork work = new SocketHandleWork () {
5 public Object handleRequest () {
6 return proceed(
7 }
8 };
9 AdaptiveThreadPool.getInstance(),run(work);
10 return work;
11 }
12 }
4.运行AOP编程工具,进行方面编织,将上述并发控制代码植入原应用服务器系统, 生成新的应用服务器系统。
权利要求
1.一种线程池容量自适应调节方法,包括下列步骤 1).预定义线程池容量的最小值、调整时间间隔以及超长任务执行系数; 2).在各个时间间隔内,测量线程池内所有活动线程的执行时间,统计线程使用量,并记录任务完成数;根据所述活动线程的执行时间和任务完成数,计算超长任务执行时间; 3).统计健康线程数,若健康线程数大于所述线程使用量,且等待队列不为空,则利用爬山算法调整线程池容量,否则进入下一个时间间隔的处理。
2. —种应用服务器并发控制方法,包括下列步骤a) .构造自适应并发控制系统,所述系统按照权利要求l所述的方法自适应调节其线程池容量;b) .构造并发方面库,定义抽象并发方面和抽象并发任务处理类;C).基于所述自适应并发控制系统和所述并发方面库,根据应用服务器的具体需求开发并发处理模块; d).进行方面编织,将所述并发处理模块植入应用服务器。
3. 如权利要求2所述的方法,其特征在于,步骤a)所述自适应并发控制系统包括资源评估 器、资源监控器、资源管理器和线程池,其中资源评估器负责进行线程池未来使用情况的评估和预测; 资源监控器负责线程池使用情况的监测和数据统计; 资源管理器负责线程池容量的动态调整; 线程池负责对线程资源进行池化管理。
4. 如权利要求2所述的方法,其特征在于,步骤b)所述并发方面库通过AOP编程工具构造。
5. 如权利要求2所述的方法,其特征在于,步骤c)所述并发处理模块通过下述方法开发i. 根据应用服务器的具体需求定义切入点和around通知,包装所述应用服务器的 并发请求,并将包装后的并发请求提交给所述自适应并发控制系统执行;ii. 扩展抽象并发任务处理类,重载并发执行方法,根据应用服务器的具体需求增 添功能。
6. 如权利要求2所述的方法,其特征在于,步骤d)采用AOP编程工具进行方面编织。
7. 如权利要求4或6所述的方法,其特征在于,所述AOP编程工具为AspectJ。
全文摘要
本发明公开了一种线程池容量自适应调节方法,以及一种应用服务器并发控制方法,属于软件技术领域。所述线程池容量自适应调节方法主要通过爬山算法实现;所述应用服务器并发控制方法包括根据所述线程池容量自适应调节方法构造自适应并发控制系统;构造并发方面库,定义抽象并发方面和抽象并发任务处理类;基于所述自适应并发控制系统和所述并发方面库,根据应用服务器的具体需求开发并发处理模块;进行方面编织,将所述并发处理模块植入应用服务器。本发明实现了应用服务器与并发控制模型之间的解耦,同时为应用服务器提供了自适应的并发控制机制。
文档编号G06F9/46GK101364185SQ20081011928
公开日2009年2月11日 申请日期2008年9月2日 优先权日2008年9月2日
发明者张文博, 伟 王, 华 钟, 峻 魏, 涛 黄 申请人:中国科学院软件研究所