线程池技术在B/S网络管理软件架构中的应用

2014-05-25 00:28霍永华曹毅刘文李文
计算机与网络 2014年6期
关键词:网络管理线程队列

霍永华 曹毅 刘文 李文

(1 中国电子科技集团公司第五十四研究所河北石家庄 050081)

(2 总参信息化部驻石家庄地区军代室河北石家庄 050081)

(3 信息化部档案馆北京 100000)

(4 中国电子系统设备工程公司研究所北京 100000)

线程池技术在B/S网络管理软件架构中的应用

霍永华1曹毅2刘文3李文4

(1 中国电子科技集团公司第五十四研究所河北石家庄 050081)

(2 总参信息化部驻石家庄地区军代室河北石家庄 050081)

(3 信息化部档案馆北京 100000)

(4 中国电子系统设备工程公司研究所北京 100000)

针对网络管理软件后台存在应用服务器的数据处理量多和资源消耗过大的问题,提出了改进算法,研究了线程池技术,包括线程池的工作原理、线程池使用方式、线程池配置方法、线程池监控方法和线程池的关闭方法。线程池根据基本线程池、工作队列和整个线程池的饱和情况进行工作,依据任务性质、任务优先级、任务执行时间和任务依赖性进行线程配置,以达到高效执行和最优资源的利用。

线程池 工作队列 任务队列 任务优先级

1 引言

合理利用线程池能够带来3个好处:①降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的资源消耗;②提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行;③提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控系统资源。

2 线程池技术

2.1 线程池工作原理

线程池工作原理如图1所示。

图1 线程池工作原理图

线程池工作原理[1]如下:

①线程池判断基本线程池是否已满,若已满,则创建一个工作线程来执行任务;否则,转入步骤②;

②线程池判断工作队列是否已满,若已满,则将新提交的任务存储在工作队列中;否则,转入步骤③;

③最后线程池判断整个线程池是否已满,若已满,则创建一个新的工作线程来执行任务;否则,交给饱和策略来处理这个任务。

2.2 线程池使用

但是要做到合理的利用线程池,必须了解线程池的使用方法和配置方法。创建一个线程池需要输入几个参数[2]:

①线程池的基本大小(corePoolSize):当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程;

②任务队列(runnableTaskQueue):用于保存等待执行的任务的阻塞队列。可以选择以下几个阻塞队列,阻塞队列名称及含义如表1所示;

③线程池最大大小(maximumPoolSize):线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是如果使用了无界的任务队列这个参数就没什么效果;

④ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字;

表1 阻塞队列名称及含义

⑤饱和策略(RejectedExecutionHandler):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常,JDK1.5提供的4种策略如表2所示;

表2 饱和策略说明

⑥keepAliveTime(线程活动保持时间):线程池的工作线程空闲后,保持存活的时间,所以如果任务很多,并且每个任务执行的时间比较短,可以调大这个时间,提高线程的利用率;

⑦TimeUnit(线程活动保持时间的单位):可选的单位有天、小时、分钟、毫秒、微秒和毫微秒。

2.3 线程池配置

要想合理的配置线程池[3],就必须首先分析任务特性,可以从以下几个角度来进行分析:①任务的性质:CPU密集型任务,IO密集型任务和混合型任务;②任务的优先级:高、中和低;③任务的执行时间:长、中和短;④任务的依赖性:是否依赖其他系统资源,如数据库连接。可以根据任务性质的不同,配置不同规模的线程池予以处理:

①CPU密集型任务:配置尽可能小的线程,如配置Ncpu+1个线程的线程池;

②IO密集型任务:由于线程并不是一直在执行任务,则配置尽可能多的线程,如2⋆Ncpu;

③混合型的任务,如果可以拆分,则将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这2个任务执行的时间相差不是太大,那么分解后执行的吞吐率要高于串行执行的吞吐率,如果这2个任务执行时间相差太大,则没必要进行分解。可以通过Runtime.getRuntime(),availableProcessors()方法获得当前设备的CPU个数;

④优先级不同的任务:可以使用优先级队列PriorityBlockingQueue来处理,可以让优先级高的任务先得到执行,需要注意的是如果一直有优先级高的任务提交到队列里,那么优先级低的任务可能永远不能执行;

⑤执行时间不同的任务:可以交给不同规模的线程池来处理,或者也可以使用优先级队列,让执行时间短的任务先执行;

⑥依赖数据库连接池的任务,因为线程提交SQL后需要等待数据库返回结果,等待的时间越长,CPU空闲时间就越长,那么线程数应该设置越大,这样才能更好的利用CPU。

建议使用有界队列,有界队列能增加系统的稳定性和预警能力,可以根据需要设大一点,比如几千。有一次使用的后台任务线程池的队列和线程池全满了,不断地出现抛弃任务的异常,通过排查发现是数据库出现了问题,导致执行SQL变得非常缓慢,因为后台任务线程池里的任务全是需要向数据库查询和插入数据的,所以导致线程池里的工作线程全部阻塞,任务积压在线程池里。如果当时设置成无界队列,线程池的队列就会越来越多,有可能会撑满内存,导致整个系统不可用,而不只是后台任务出现问题。当然系统所有的任务是用的单独的服务器部署的,而使用不同规模的线程池跑不同类型的任务,但是出现这样问题时也会影响到其他任务。

2.4 线程池监控

通过线程池提供的参数进行监控。线程池里有一些属性在监控线程池的时候可以使用:

①askCount:线程池需要执行的任务数量;

②completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount;

③largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了;

④getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不减,getActiveCount:获取活动的线程数。

通过扩展线程池进行监控。通过继承线程池并重写线程池的beforeExecute,afterExecute和terminated方法,可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间、最大执行时间和最小执行时间等,这几个方法在线程池里是空方法。

2.5 线程池关闭

可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池,他们的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务可能永远无法终止。但是他们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

只要调用了这2个关闭方法的其中一个,isShutdown方法就会返回true。当所有的任务都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true。至于应该调用哪一种方法来关闭线程池,应该由提交到线程池的任务特性决定,通常调用shutdown来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow。

3 实例应用

在某网管项目中,基于B/S网管软件架构[4-6]。由于被管对象种类多参数量非常大,且通常有多个客户端同时访问服务器,并发操作多。在未使用线程池时,经常会发生操作请求缓慢和死机现象。采用线程池后,在AS应用服务器中,针对拓扑管理、告警管理、性能管理、SNMP通信机和专用协议通信机等模块,根据功能模块的不同、功能优先级、执行频率和执行时间等,基于配置文件进行线程池的灵活配置,包括线程池的基本大小、最大大小和执行时间等,使用不同规模的线程池运行不同类型的任务。通过应用线程池,大大提高了应用服务器的数据处理效率,提高了操作响应速度,避免了死机现象的发生。

针对该项目被管对象多和参数多的特点,需要定时轮询在网设备的状态和各项参数,因此对拓扑管理、故障管理和性能管理功能模块配置了线程池和执行优先级。拓扑管理要定时轮询设备状态,告警管理要查询重要设备参数的运行情况,性能管理轮询重要性能参数值,以进行越限处理。配置文件内容如下:

4 结束语

在基于B/S的网络管理软件体系架构中,由于AS应用服务器需要处理所有的与被管对象相关的数据采集、数据处理、数据上报和数据存储,同时还要完成与前台页面的数据请求和数据交互,尤其是当被管对象种类多且参数量大时,AS应用服务器需要频繁处理大量数据,因此处理效率和系统资源消耗都非常大。线程池技术是一种很好的解决此类问题的技术,线程池技术的应用对于提高软件运行效率,节省系统资源有很大帮助。事实证明,线程池技术在基于B/S架构的网络管理软件的AS应用服务器中的应用中达到了高效率和低消耗的目的。

[1]LENNSELIUS B,RYDSTROM.Software Fault Content and Reliability Estimations for Telecommunications System[J]. IEEE Trans.Selected Areas in Communications,1990,8(2): 262-271.

[2]DOWNS T,SCOTT A.Evaluating the Performance Id Software Reliability Models[J].Reliability,IEEE Transactions on,1992,41(4):12-16.

[3]ZAHEDI F,ASHRAFI N.Software Reliability Allocation Based on Structure Utility,Price and Cost[J].Software Engineering,IEEE Transactions on,1991,17(21):345-356.

[4]张楠,邱雪松.基于Web服务的电信网络管理架构研究和实现[J].计算机应用研究,2008(6):1882-1885.

[5]马俊,丁晓明.基于SOA的异构系统集成研究[J].计算机工程与设计,2008(7):3638-3641.

[6]谭永明,苏斌.面向服务架构体系的研究[J].计算机技术与发展,2007(3):132-134.

Application of Thread Pool Technology in B/S Network Management Software Architecture

HUO Yong-hua1CAO Yi2LIU Wen3LI Wen4
(1 The 54th Research Institute of CETC,Shijiazhuang Hebei 050081,China)
(2 Military Representative Office of Information Technology Department of PLA General Staff Headquarters Stationed in Shijiazhuang Region,Shijiazhuang Hebei 050081,China)
(3 The Archives of Ministry of Industry and Information Technology,Beijing 100000,China)
(4 Institute of China Electronics System Engineering Company,Beijing 100000,China)

Aiming at the problems of large data processing capacity and excessive resource consumption of application server existing in the background of network management software,this paper proposes an improved algorithm and studies such thread pool technology as operational principle,usage mode,configuration method,monitoring method and shutdown method of thread pool.The thread pool works according to the saturation situation of basic thread pool,work queue and whole tread pool.The thread configuration is carried out according to task nature,priority,execution time and interdependence,in order to achieve the efficient implementation and the optimal usage of resources.

thread pool;work queue;task queue;task priority

TP393

A

1008-1739(2014)06-54-49-4

定稿日期:2014-02-26

猜你喜欢
网络管理线程队列
队列里的小秘密
基于多队列切换的SDN拥塞控制*
基于国产化环境的线程池模型研究与实现
在队列里
电动汽车充电服务网络管理初探
丰田加速驶入自动驾驶队列
浅谈linux多线程协作
基于EOC通道的SHDSL网络管理技术
校园网络管理及安全防护
卫星导航网络管理设计