◆王韓波 孫文俊 林 鵬
基于國產化環(huán)境的線程池模型研究與實現(xiàn)
◆王韓波1孫文俊1林 鵬2
(1.中國電子科技集團公司第二十八研究所 江蘇 210007;2.92020部隊 山東 266000)
為滿足面向服務化和大數(shù)據(jù)的大型企業(yè)級信息系統(tǒng)的高并發(fā)、高吞吐、安全性需求,也為適應新形勢下國防網絡信息系統(tǒng)逐步向國產化自主平臺遷移的行業(yè)發(fā)展趨勢,本文通過對常用線程池模型的比較研究,提出了固定無優(yōu)先級領導者/跟隨者線程池和動態(tài)有優(yōu)先級半同步/半異步線程池模型,并提供基于銀河麒麟操作系統(tǒng)+飛騰CPU的國產自主環(huán)境的實現(xiàn)方案。
線程池模型;國產化環(huán)境;領導者/跟隨者;半同步/半異步
多線程技術主要分為兩種:在需要時進行創(chuàng)建的經典多線程處理方式和基于預創(chuàng)建的線程池處理方式[1]。經典多線程是一種按需創(chuàng)建的機制,為每個請求創(chuàng)建獨立的線程進行處理,邏輯簡單且可靠性高,適用于并發(fā)量少且不密集的應用場景。一旦系統(tǒng)出現(xiàn)并發(fā)請求峰值時,大量資源的創(chuàng)建和銷毀開銷將嚴重影響系統(tǒng)響應能力。因此在高并發(fā)服務端使用場景下,基于預創(chuàng)建的線程池解決方案更為常見。
為滿足面向服務化和大數(shù)據(jù)的大型企業(yè)級業(yè)務信息系統(tǒng)的高并發(fā)、高吞吐需求,也為適應國防信息安全領域逐步向國產化軟硬件平臺遷移的行業(yè)發(fā)展趨勢,有必要基于國產化環(huán)境研究通用線程池技術,探索其國產化平臺的實現(xiàn)方案,為未來國產化環(huán)境下如何提高系統(tǒng)效率尋找一種切實有效的解決方法。
對線程池的研究主要從三個方面進行:一是線程池的大小設定;二是線程池的優(yōu)先級設定;三是線程池的設計模式。線程池大小設定影響線程池對系統(tǒng)資源的需求,按照線程池內線程數(shù)量能否增減,可將線程池劃分為固定線程池和動態(tài)線程池[2]。線程池優(yōu)先級設定通常有兩種類型,一是線程池中所有線程的優(yōu)先級別相同,即無通道模式;另一種是線程池中的線程有一定的優(yōu)先級別,即有通道的模式,線程池中不同的優(yōu)先級別對應著線程不同的數(shù)據(jù)存儲方式,同時也影響者線程池大小[2]。線程池的常見設計模式則主要包括:半同步/半異步(Half-Sync/Half-Async)和領導者/跟隨者(Leader/Follower)兩種。文獻[3]深入分析了并發(fā)用戶數(shù)、請求處理時間和線程池中線程數(shù)對Half-Sync/Half-Async和Leader/Follower這兩種線程池設計模式對系統(tǒng)性能的影響,并在不同場景下對兩種設計模式的線程池性能表現(xiàn)做了比較。
通過分析常見大型業(yè)務信息系統(tǒng)多線程并發(fā)需求的特點,文章選擇不同的線程池設計策略組合,提出以下兩種通用線程池模型:(1)固定無優(yōu)先級領導者/跟隨者線程池(本文簡稱簡單LF線程池);(2)動態(tài)有優(yōu)先級半同步/半異步線程池(本文簡稱動態(tài)HH線程池)。
為了在簡單多任務并發(fā)處理的場景下,更好地利用多線程的并發(fā)優(yōu)勢,降低程序的復雜度,提高產品的穩(wěn)定性,提出簡單LF線程池模型,如圖1所示。
簡單LF線程池的簡單主要指對線程池內線程數(shù)量做固定設計,線程間不區(qū)分優(yōu)先級按照先到先執(zhí)行原則進行調度作業(yè)。LF是指線程池采用領導者/跟隨者(Leader/Follower)的設計模式,由領導者(leader)線程負責線程池請求事件監(jiān)聽和消息分離,并從跟隨者(follower)中遴選新的領導者線程,然后自己以執(zhí)行線程(processor)的身份去處理相關事件,直到本次請求處理完畢后恢復為follower線程并等待重新被遴選為leader線程。其中l(wèi)eader線程的挑選方式,可根據(jù)實際情況決定,通常采用先進先出、隨機指定等簡單原則。
圖1 簡單LF線程池模型
簡單LF線程池模型設計簡單、成熟度高、運行穩(wěn)定,但在大量負載動態(tài)變化或線程任務存在不同實時性要求的情況下并不適用。由于空閑線程不會被銷毀,在用戶的并發(fā)需求較低時,線程池仍維持著為正常運行設計的線程數(shù),將會造成大量的系統(tǒng)資源浪費;而當用戶請求峰值出現(xiàn)時,線程池無法提供更多的工作線程,使得用戶請求大量積壓甚至超時失效,從而造成系統(tǒng)響應能力的進一步惡化。此外線程池中的線程優(yōu)先級全部相同,高負載環(huán)境下大量普通非實時任務會搶占過多的處理器資源,實時任務卻無法得到及時處理。
簡單LF線程池模型由于缺乏靈活性和優(yōu)先級考慮,難以滿足強實時數(shù)據(jù)處理和復雜多任務調度的實際要求,如實時情報處理軟件和高并發(fā)服務網關等。為滿足高并發(fā)場景下的使用需求,在常規(guī)線程池的基礎上對線程池的線程數(shù)量、優(yōu)先級、調度機制等進行設計優(yōu)化,提出動態(tài)HH線程池模型,如圖2所示。
圖2 動態(tài)HH線程池模型
動態(tài)HH線程池模型的動態(tài)性體現(xiàn)在兩個方面:(1)支持線程數(shù)量的動態(tài)調整,通過初始化線程池為一個預先設定的固定大小,再根據(jù)實際需求動態(tài)增減臨時線程的數(shù)量,提供動態(tài)伸縮的線程池并發(fā)處理能力。(2)支持線程優(yōu)先級的動態(tài)設定,通過等待處理的任務優(yōu)先級動態(tài)指定處理線程的優(yōu)先級,支持實時任務獲得更多處理能力。
動態(tài)HH線程池模型參考CORBA標準(簡稱RT-CORBA),RT-CORBA提供了半同步/半異步(Half-Sync/Half-Async)線程池的設計模式。Half-Sync/Half-Async將同步模式與異步模式相結合,異步層完成數(shù)據(jù)的I/O操作,提高系統(tǒng)整體I/O效率,同步層進行業(yè)務的請求處理,降低線程池復雜度,通過優(yōu)先級消息隊列來完成數(shù)據(jù)交互。
目前常見的國產化基礎軟件環(huán)境包括以中標、銀河麒麟操作系統(tǒng)為代表的國產操作系統(tǒng),以武漢達夢、人大金倉為代表的國產數(shù)據(jù)庫管理系統(tǒng),國產化基礎硬件環(huán)境包括基于龍芯、飛騰CPU解決方案的各類終端和服務器設備[4]。本文僅以“銀河麒麟操作系統(tǒng)+飛騰CPU”的國產化解決方案為例,討論簡單LF線程池模型和動態(tài)HH線程池模型的實現(xiàn)方案。但實際上以指揮信息系統(tǒng)為例,今后將會相當長的一段時期內,同時在Windows、Unix、銀河麒麟等多種操作系統(tǒng)上運行。盡管各操作系統(tǒng)的實現(xiàn)方案會存在種種細節(jié)方面的不同(如:pthread和solaris thread,epoll、kqueue和iocp等),但是簡單LF線程池模型和動態(tài)HH線程池模型的運作機理不會改變。
簡單LF線程池使用Reactor設計模式來實現(xiàn)事件的多路分離,很多高性能網絡應用如Netty、Redis均在使用類似的IO方式。其中事件源和分離機制采用銀河麒麟操作系統(tǒng)中最常用的fd_set 和select 系統(tǒng)調用。簡單LF線程池模型的實現(xiàn)類圖如圖3 所示。
簡單LF線程池模型將請求的I/O處理部分封裝為統(tǒng)一的事件回調接口,任意時刻只有l(wèi)eader線程負責響應I/O句柄事件,不再是一對一的經典I/O響應機制,其他follower線程將處于靜默等待狀態(tài)。線程間使用信號量作為同步機制,所有follower 線程阻塞在同一個LF選主信號量上等待,直到當前l(fā)eader線程釋放出下一輪選主通知。
動態(tài)HH線程池的異步層負責I/O層事件監(jiān)聽,使用Reactor 模式實現(xiàn)異步層事件派分,在完成消息提取后放入到線程池消息隊列等待處理??紤]到銀河麒麟操作系統(tǒng)是基于Linux內核實現(xiàn),選用更高效的epoll系統(tǒng)調用實現(xiàn)高效的事件通知機制,使用fd_set 數(shù)據(jù)結構來標識事件源。線程池的同步層和消息隊列使用主動對象(Active-Object)設計模式來實現(xiàn),主動對象模式抽象并發(fā)任務為邏輯請求對象,通過異步編程的方法調用(Method Invocation)和方法執(zhí)行(Method Execution)的分離設計,實現(xiàn)動態(tài)HH線程池請求提取和請求處理在不同的線程中執(zhí)行,最終完成同步層和異步層的分離。動態(tài)HH線程池的實現(xiàn)類圖如圖4所示。
常見的動態(tài)線程池大小調整方案有兩種:一是閾值觸發(fā)式調整,二是公式預測式調整。閾值觸發(fā)式指按照預先設定的線程池參數(shù)來控制線程池的擴展和收縮行為,簡單易實現(xiàn)且維護性開銷小,但線程池參數(shù)需要精確地校正,否則會導致系統(tǒng)性能下降;公式預測式指通過經驗公式來預測未來線程池的最優(yōu)大小,往往更能反映業(yè)務系統(tǒng)運行中資源消耗的真實情況,并根據(jù)統(tǒng)計學原理快速調整線程池規(guī)模,但通用性較差,需要較大的資源狀態(tài)采集、統(tǒng)計和預測動作的開銷。
圖3 簡單LF線程池實現(xiàn)類圖
圖4 動態(tài)HH線程池實現(xiàn)類圖
為保證動態(tài)HH線程池在不同使用場景下的適用性,文中采用了第一種調整方案,并支持閾值參數(shù)的可調整。假設線程池最大線程數(shù)量為T_MAX,最小為T_MIN,單次可調整線程數(shù)為T_NUM,最小空閑數(shù)量為T_IMIN,最大為T_IMAX。動態(tài)HH線程池的線程池大小動態(tài)調整策略如下:
(1)首先建立線程池,創(chuàng)建T_MIN個初始線程;
(2)當線程池中空閑線程數(shù)低于T_IMIN時,觸發(fā)線程池動態(tài)擴張機制,創(chuàng)建并添加T_NUM個空閑線程;
(3)當線程池中空閑線程數(shù)高于T_IMAX時,觸發(fā)線程池動態(tài)收縮機制,回收并刪除T_NUM個空閑線程;
(4)線程池動態(tài)調整過程中,保證線程池中線程數(shù)量不超過T_MAX也不低于T_MIN;
(5)若線程池已達最大限制且無空閑線程可用時,任務請求將被存入緩沖隊列,等待空閑線程出現(xiàn)并處理。
以上參數(shù)的合理設置可以保證任意時刻系統(tǒng)均具有一定的并發(fā)請求響應能力,緩沖區(qū)的存在也在一定程度上降低了動態(tài)調整或瞬間峰值過程中任務丟失的可能性。
為滿足面向服務化和大數(shù)據(jù)的大型企業(yè)級信息系統(tǒng)的高并發(fā)、高吞吐需求,以及國產化發(fā)展趨勢,本文提出一組適用于常見的業(yè)務信息系統(tǒng)需求的線程池模型,并提供了基于銀河麒麟操作系統(tǒng)+飛騰CPU國產化自主環(huán)境的實現(xiàn)方案。通過實際的項目試用過程中發(fā)現(xiàn),簡單LF線程池和動態(tài)HH線程池能夠很好解決常見的信息系統(tǒng)并發(fā)需求。后續(xù)在此研究基礎上封裝跨平臺的多線程開發(fā)基礎支撐庫,以達到減少開發(fā)人員日后遷移工作量、提高代碼復用率、提升程序魯棒性和降低軟件維護成本的目的。
[1]唐富強,于鴻洋,張萍.Linux下通用線程池的改進與實現(xiàn)[J].計算機工程與應用,2012.
[2]聶蘭蘭.考慮外界影響因子的動態(tài)線程池優(yōu)化設計與實現(xiàn)[D].武漢:華中科技大學,2014.
[3]李剛,金蓓弘.兩種線程池的實現(xiàn)和性能評價[J].計算機工程與設計,2007.
[4]陳奡,王超,張永等.國產化Web信息系統(tǒng)性能評估模型與優(yōu)化方法[J].指揮信息系統(tǒng)與技術,2015.
[5]趙海,李志蜀,韓學為等.線程池的優(yōu)化設計[J].四川大學學報(自然科學版),2005.
[6]劉云生,王剛,王衛(wèi)國.實時線程池性能研究與動態(tài)優(yōu)化[J].計算機工程與科學,2007.
[7]謝宙宇,臧飛.基于國產軟硬件的信息系統(tǒng)性能優(yōu)化技術[J].指揮信息系統(tǒng)與技術,2014.