霍永華 曹毅 劉文 李文
(1 中國電子科技集團(tuán)公司第五十四研究所河北石家莊 050081)
(2 總參信息化部駐石家莊地區(qū)軍代室河北石家莊 050081)
(3 信息化部檔案館北京 100000)
(4 中國電子系統(tǒng)設(shè)備工程公司研究所北京 100000)
線程池技術(shù)在B/S網(wǎng)絡(luò)管理軟件架構(gòu)中的應(yīng)用
霍永華1曹毅2劉文3李文4
(1 中國電子科技集團(tuán)公司第五十四研究所河北石家莊 050081)
(2 總參信息化部駐石家莊地區(qū)軍代室河北石家莊 050081)
(3 信息化部檔案館北京 100000)
(4 中國電子系統(tǒng)設(shè)備工程公司研究所北京 100000)
針對網(wǎng)絡(luò)管理軟件后臺存在應(yīng)用服務(wù)器的數(shù)據(jù)處理量多和資源消耗過大的問題,提出了改進(jìn)算法,研究了線程池技術(shù),包括線程池的工作原理、線程池使用方式、線程池配置方法、線程池監(jiān)控方法和線程池的關(guān)閉方法。線程池根據(jù)基本線程池、工作隊(duì)列和整個線程池的飽和情況進(jìn)行工作,依據(jù)任務(wù)性質(zhì)、任務(wù)優(yōu)先級、任務(wù)執(zhí)行時間和任務(wù)依賴性進(jìn)行線程配置,以達(dá)到高效執(zhí)行和最優(yōu)資源的利用。
線程池 工作隊(duì)列 任務(wù)隊(duì)列 任務(wù)優(yōu)先級
合理利用線程池能夠帶來3個好處:①降低資源消耗:通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的資源消耗;②提高響應(yīng)速度:當(dāng)任務(wù)到達(dá)時,任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行;③提高線程的可管理性:線程是稀缺資源,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控系統(tǒng)資源。
2.1 線程池工作原理
線程池工作原理如圖1所示。
圖1 線程池工作原理圖
線程池工作原理[1]如下:
①線程池判斷基本線程池是否已滿,若已滿,則創(chuàng)建一個工作線程來執(zhí)行任務(wù);否則,轉(zhuǎn)入步驟②;
②線程池判斷工作隊(duì)列是否已滿,若已滿,則將新提交的任務(wù)存儲在工作隊(duì)列中;否則,轉(zhuǎn)入步驟③;
③最后線程池判斷整個線程池是否已滿,若已滿,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù);否則,交給飽和策略來處理這個任務(wù)。
2.2 線程池使用
但是要做到合理的利用線程池,必須了解線程池的使用方法和配置方法。創(chuàng)建一個線程池需要輸入幾個參數(shù)[2]:
①線程池的基本大?。╟orePoolSize):當(dāng)提交一個任務(wù)到線程池時,線程池會創(chuàng)建一個線程來執(zhí)行任務(wù),即使其他空閑的基本線程能夠執(zhí)行新任務(wù)也會創(chuàng)建線程,等到需要執(zhí)行的任務(wù)數(shù)大于線程池基本大小時就不再創(chuàng)建。如果調(diào)用了線程池的prestartAllCoreThreads方法,線程池會提前創(chuàng)建并啟動所有基本線程;
②任務(wù)隊(duì)列(runnableTaskQueue):用于保存等待執(zhí)行的任務(wù)的阻塞隊(duì)列。可以選擇以下幾個阻塞隊(duì)列,阻塞隊(duì)列名稱及含義如表1所示;
③線程池最大大?。╩aximumPoolSize):線程池允許創(chuàng)建的最大線程數(shù)。如果隊(duì)列滿了,并且已創(chuàng)建的線程數(shù)小于最大線程數(shù),則線程池會再創(chuàng)建新的線程執(zhí)行任務(wù)。值得注意的是如果使用了無界的任務(wù)隊(duì)列這個參數(shù)就沒什么效果;
④ThreadFactory:用于設(shè)置創(chuàng)建線程的工廠,可以通過線程工廠給每個創(chuàng)建出來的線程設(shè)置更有意義的名字;
表1 阻塞隊(duì)列名稱及含義
⑤飽和策略(RejectedExecutionHandler):當(dāng)隊(duì)列和線程池都滿了,說明線程池處于飽和狀態(tài),那么必須采取一種策略處理提交的新任務(wù)。這個策略默認(rèn)情況下是AbortPolicy,表示無法處理新任務(wù)時拋出異常,JDK1.5提供的4種策略如表2所示;
表2 飽和策略說明
⑥keepAliveTime(線程活動保持時間):線程池的工作線程空閑后,保持存活的時間,所以如果任務(wù)很多,并且每個任務(wù)執(zhí)行的時間比較短,可以調(diào)大這個時間,提高線程的利用率;
⑦TimeUnit(線程活動保持時間的單位):可選的單位有天、小時、分鐘、毫秒、微秒和毫微秒。
2.3 線程池配置
要想合理的配置線程池[3],就必須首先分析任務(wù)特性,可以從以下幾個角度來進(jìn)行分析:①任務(wù)的性質(zhì):CPU密集型任務(wù),IO密集型任務(wù)和混合型任務(wù);②任務(wù)的優(yōu)先級:高、中和低;③任務(wù)的執(zhí)行時間:長、中和短;④任務(wù)的依賴性:是否依賴其他系統(tǒng)資源,如數(shù)據(jù)庫連接??梢愿鶕?jù)任務(wù)性質(zhì)的不同,配置不同規(guī)模的線程池予以處理:
①CPU密集型任務(wù):配置盡可能小的線程,如配置Ncpu+1個線程的線程池;
②IO密集型任務(wù):由于線程并不是一直在執(zhí)行任務(wù),則配置盡可能多的線程,如2?Ncpu;
③混合型的任務(wù),如果可以拆分,則將其拆分成一個CPU密集型任務(wù)和一個IO密集型任務(wù),只要這2個任務(wù)執(zhí)行的時間相差不是太大,那么分解后執(zhí)行的吞吐率要高于串行執(zhí)行的吞吐率,如果這2個任務(wù)執(zhí)行時間相差太大,則沒必要進(jìn)行分解。可以通過Runtime.getRuntime(),availableProcessors()方法獲得當(dāng)前設(shè)備的CPU個數(shù);
④優(yōu)先級不同的任務(wù):可以使用優(yōu)先級隊(duì)列PriorityBlockingQueue來處理,可以讓優(yōu)先級高的任務(wù)先得到執(zhí)行,需要注意的是如果一直有優(yōu)先級高的任務(wù)提交到隊(duì)列里,那么優(yōu)先級低的任務(wù)可能永遠(yuǎn)不能執(zhí)行;
⑤執(zhí)行時間不同的任務(wù):可以交給不同規(guī)模的線程池來處理,或者也可以使用優(yōu)先級隊(duì)列,讓執(zhí)行時間短的任務(wù)先執(zhí)行;
⑥依賴數(shù)據(jù)庫連接池的任務(wù),因?yàn)榫€程提交SQL后需要等待數(shù)據(jù)庫返回結(jié)果,等待的時間越長,CPU空閑時間就越長,那么線程數(shù)應(yīng)該設(shè)置越大,這樣才能更好的利用CPU。
建議使用有界隊(duì)列,有界隊(duì)列能增加系統(tǒng)的穩(wěn)定性和預(yù)警能力,可以根據(jù)需要設(shè)大一點(diǎn),比如幾千。有一次使用的后臺任務(wù)線程池的隊(duì)列和線程池全滿了,不斷地出現(xiàn)拋棄任務(wù)的異常,通過排查發(fā)現(xiàn)是數(shù)據(jù)庫出現(xiàn)了問題,導(dǎo)致執(zhí)行SQL變得非常緩慢,因?yàn)楹笈_任務(wù)線程池里的任務(wù)全是需要向數(shù)據(jù)庫查詢和插入數(shù)據(jù)的,所以導(dǎo)致線程池里的工作線程全部阻塞,任務(wù)積壓在線程池里。如果當(dāng)時設(shè)置成無界隊(duì)列,線程池的隊(duì)列就會越來越多,有可能會撐滿內(nèi)存,導(dǎo)致整個系統(tǒng)不可用,而不只是后臺任務(wù)出現(xiàn)問題。當(dāng)然系統(tǒng)所有的任務(wù)是用的單獨(dú)的服務(wù)器部署的,而使用不同規(guī)模的線程池跑不同類型的任務(wù),但是出現(xiàn)這樣問題時也會影響到其他任務(wù)。
2.4 線程池監(jiān)控
通過線程池提供的參數(shù)進(jìn)行監(jiān)控。線程池里有一些屬性在監(jiān)控線程池的時候可以使用:
①askCount:線程池需要執(zhí)行的任務(wù)數(shù)量;
②completedTaskCount:線程池在運(yùn)行過程中已完成的任務(wù)數(shù)量。小于或等于taskCount;
③largestPoolSize:線程池曾經(jīng)創(chuàng)建過的最大線程數(shù)量。通過這個數(shù)據(jù)可以知道線程池是否滿過。如等于線程池的最大大小,則表示線程池曾經(jīng)滿了;
④getPoolSize:線程池的線程數(shù)量。如果線程池不銷毀的話,池里的線程不會自動銷毀,所以這個大小只增不減,getActiveCount:獲取活動的線程數(shù)。
通過擴(kuò)展線程池進(jìn)行監(jiān)控。通過繼承線程池并重寫線程池的beforeExecute,afterExecute和terminated方法,可以在任務(wù)執(zhí)行前,執(zhí)行后和線程池關(guān)閉前干一些事情。如監(jiān)控任務(wù)的平均執(zhí)行時間、最大執(zhí)行時間和最小執(zhí)行時間等,這幾個方法在線程池里是空方法。
2.5 線程池關(guān)閉
可以通過調(diào)用線程池的shutdown或shutdownNow方法來關(guān)閉線程池,他們的原理是遍歷線程池中的工作線程,然后逐個調(diào)用線程的interrupt方法來中斷線程,所以無法響應(yīng)中斷的任務(wù)可能永遠(yuǎn)無法終止。但是他們存在一定的區(qū)別,shutdownNow首先將線程池的狀態(tài)設(shè)置成STOP,然后嘗試停止所有的正在執(zhí)行或暫停任務(wù)的線程,并返回等待執(zhí)行任務(wù)的列表,而shutdown只是將線程池的狀態(tài)設(shè)置成SHUTDOWN狀態(tài),然后中斷所有沒有正在執(zhí)行任務(wù)的線程。
只要調(diào)用了這2個關(guān)閉方法的其中一個,isShutdown方法就會返回true。當(dāng)所有的任務(wù)都已關(guān)閉后,才表示線程池關(guān)閉成功,這時調(diào)用isTerminaed方法會返回true。至于應(yīng)該調(diào)用哪一種方法來關(guān)閉線程池,應(yīng)該由提交到線程池的任務(wù)特性決定,通常調(diào)用shutdown來關(guān)閉線程池,如果任務(wù)不一定要執(zhí)行完,則可以調(diào)用shutdownNow。
在某網(wǎng)管項(xiàng)目中,基于B/S網(wǎng)管軟件架構(gòu)[4-6]。由于被管對象種類多參數(shù)量非常大,且通常有多個客戶端同時訪問服務(wù)器,并發(fā)操作多。在未使用線程池時,經(jīng)常會發(fā)生操作請求緩慢和死機(jī)現(xiàn)象。采用線程池后,在AS應(yīng)用服務(wù)器中,針對拓?fù)涔芾?、告警管理、性能管理、SNMP通信機(jī)和專用協(xié)議通信機(jī)等模塊,根據(jù)功能模塊的不同、功能優(yōu)先級、執(zhí)行頻率和執(zhí)行時間等,基于配置文件進(jìn)行線程池的靈活配置,包括線程池的基本大小、最大大小和執(zhí)行時間等,使用不同規(guī)模的線程池運(yùn)行不同類型的任務(wù)。通過應(yīng)用線程池,大大提高了應(yīng)用服務(wù)器的數(shù)據(jù)處理效率,提高了操作響應(yīng)速度,避免了死機(jī)現(xiàn)象的發(fā)生。
針對該項(xiàng)目被管對象多和參數(shù)多的特點(diǎn),需要定時輪詢在網(wǎng)設(shè)備的狀態(tài)和各項(xiàng)參數(shù),因此對拓?fù)涔芾?、故障管理和性能管理功能模塊配置了線程池和執(zhí)行優(yōu)先級。拓?fù)涔芾硪〞r輪詢設(shè)備狀態(tài),告警管理要查詢重要設(shè)備參數(shù)的運(yùn)行情況,性能管理輪詢重要性能參數(shù)值,以進(jìn)行越限處理。配置文件內(nèi)容如下:
在基于B/S的網(wǎng)絡(luò)管理軟件體系架構(gòu)中,由于AS應(yīng)用服務(wù)器需要處理所有的與被管對象相關(guān)的數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)上報(bào)和數(shù)據(jù)存儲,同時還要完成與前臺頁面的數(shù)據(jù)請求和數(shù)據(jù)交互,尤其是當(dāng)被管對象種類多且參數(shù)量大時,AS應(yīng)用服務(wù)器需要頻繁處理大量數(shù)據(jù),因此處理效率和系統(tǒng)資源消耗都非常大。線程池技術(shù)是一種很好的解決此類問題的技術(shù),線程池技術(shù)的應(yīng)用對于提高軟件運(yùn)行效率,節(jié)省系統(tǒng)資源有很大幫助。事實(shí)證明,線程池技術(shù)在基于B/S架構(gòu)的網(wǎng)絡(luò)管理軟件的AS應(yīng)用服務(wù)器中的應(yīng)用中達(dá)到了高效率和低消耗的目的。
[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服務(wù)的電信網(wǎng)絡(luò)管理架構(gòu)研究和實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2008(6):1882-1885.
[5]馬俊,丁曉明.基于SOA的異構(gòu)系統(tǒng)集成研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2008(7):3638-3641.
[6]譚永明,蘇斌.面向服務(wù)架構(gòu)體系的研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,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