摘 要: 提出了一種基于主動隊列管理的并發(fā)服務器模型,在主動隊列管理的并發(fā)服務器模型下,研究了服務器對各隊列、各線程運用負載均衡" title="負載均衡">負載均衡的策略和算法。
關(guān)鍵詞: 并發(fā)服務器 負載均衡 主動隊列管理
互聯(lián)網(wǎng)用戶數(shù)和網(wǎng)絡流量的幾何級數(shù)增長對網(wǎng)絡服務器的可用性提出了更高要求。當網(wǎng)絡數(shù)據(jù)流不能在各服務器之間有效分配時,會出現(xiàn)負載失衡。
針對該問題,本文在單服務器模式下,通過合理分配線程、協(xié)調(diào)隊列、采用單服務器主動管理隊列等方法實現(xiàn)了多線程多任務下的負載均衡。
1 基于主動隊列管理的并發(fā)型服務器模型
1.1 服務器的分類和簡介
在實際的網(wǎng)絡程序中,通常都是許多客戶機對應一臺服務器。為處理客戶機的請求,對服務端的程序提出了特殊要求。目前最常用的服務器模型分為兩種:(1)循環(huán)服務器,在同一個時刻僅響應一個客戶端" title="客戶端">客戶端的請求;(2)并發(fā)服務器,在同一個時刻可響應多個客戶端請求。
循環(huán)服務器包括數(shù)據(jù)報協(xié)議(UDP)服務器和傳輸控制協(xié)議(TCP)服務器。實現(xiàn)非常簡單:數(shù)據(jù)報協(xié)議服務器每次從套接字上讀取一個客戶端的請求進行處理,然后將結(jié)果返回給客戶機;傳輸控制協(xié)議服務器接受一個客戶端的連接請求,然后處理,完成了該客戶的所有請求后,斷開連接。
并發(fā)服務器的思想是每個客戶機的請求不由服務器直接處理,而是服務器創(chuàng)建一個子進程來處理。這樣可以使服務器進程在同一時間有多個子進程與不同的客戶程序連接和通信。在客戶程序看來,服務器可以并發(fā)地處理多個客戶的請求。
一般TCP/IP服務器通信軟件" title="通信軟件">通信軟件均為并發(fā)型,即由一個守護進程負責監(jiān)聽客戶機的連接請求,并生成一個或多個子進程與客戶機建立連接,以完成通信。其缺點是隨著連接客戶機數(shù)量的增多,生成的通信子進程數(shù)量也會隨之增多,在客戶機數(shù)量較多的應用場合勢必影響服務器的運行效率。一般的循環(huán)服務是指服務器在接收客戶機的連接請求后即與之建立連接,只有處理完與客戶機的通信任務后,才能再去接收另一客戶機的請求連接。其優(yōu)點是不必生成通信子進程。缺點是客戶機在每次通信之前都要與服務器建立連接,開銷過大,不能用于隨機的數(shù)據(jù)通信和繁忙的業(yè)務處理。
1.2 模型的提出
本文提出了一種新型的基于主動隊列管理的并發(fā)型服務器通信軟件的設計方法,不同于一般的并發(fā)型服務器和循環(huán)型服務器通信軟件,它摒棄了上述兩類服務器的缺點,綜合其優(yōu)點。該軟件的優(yōu)點是:生成子進程數(shù)目少;設定了子線程的上限值;繼承了并發(fā)通信的優(yōu)點,容易對客戶機與服務器的連接進行管理;適用于客戶機數(shù)量較多和隨機數(shù)據(jù)通信的情況,能夠有效地提高服務器的運行效率。服務器系統(tǒng)模型圖如圖1所示。
這種設計方法的基本思想是:首先設置服務器子線程數(shù)的上限值TNMAX,避免子線程數(shù)過多,影響效率。然后將服務器設為監(jiān)聽狀態(tài)。當?shù)谝慌_客戶機C1向服務器請求連接時,服務器的守護進程與之建立初始連接L0,客戶機利用L0向服務器發(fā)送IP地址和端口號" title="端口號">端口號,守護進程將客戶機的IP地址和端口號登記在共享內(nèi)存的記錄中,然后關(guān)閉L0。由守護進程生成的一個通信子進程Pc1,從共享內(nèi)存中獲得客戶機IP地址及端口號后,建立一個與客戶機的連接L1,準備進行讀寫,并分配可用的線程數(shù),同時設置當前與服務器連接的客戶端數(shù),設置分配給它的線程數(shù)。守護進程繼續(xù)監(jiān)聽來自客戶端的連接。當另一臺客戶機C2請求連接時,將客戶機IP地址和端口號同樣登記在共享內(nèi)存中。守護進程再生成一個通信子進程Pc2,建立與客戶機的連接L2,然后添加隊列,分配可用線程數(shù),同時更新服務器記錄的客戶端數(shù)和各自對應分配的線程數(shù)。這樣逐一連接客戶端,生成通信子進程,添加隊列,直至達到子線程數(shù)的上限值。當達到上限值TNMAX時,若再有客戶機連接,則服務器回復消息令其等待,客戶機輪詢直至被分配到線程。當某個客戶端傳輸完畢時,刪除隊列,刪除分配的線程數(shù),終止子進程,并更新服務器的記錄。這樣做不僅發(fā)揮了并發(fā)服務器的優(yōu)點,且避免了子進程過多的缺點。服務器通過主動的隊列管理機制實現(xiàn)對多個客戶端的協(xié)調(diào)和處理,極大地提高了運行效率。
1.3 進程管理的實現(xiàn)
在本系統(tǒng)中,服務器采用基于主動消息隊列管理的并發(fā)服務器模型。并發(fā)服務器的引入是與進程密切相關(guān)的,且Linux的進程管理也非常符合并發(fā)服務器的工作原理。本系統(tǒng)實現(xiàn)Linux服務器端的通信和進程管理,步驟如下:
(1)服務器端打開一個已知的監(jiān)聽端口;
(2)在監(jiān)聽端口上監(jiān)聽客戶機的連接請求,當有一客戶機請求連接時,建立連接線路并返回通信文件描述符" title="描述符">描述符;
(3)父進程創(chuàng)建一子進程,父進程關(guān)閉通信文件描述符,并繼續(xù)監(jiān)聽端口上的客戶機連接請求;
(4)子進程通過通信文件描述符與客戶機進行通信,通信結(jié)束后終止子進程,并關(guān)閉通信文件描述符。
系統(tǒng)服務器端管理流程圖如圖2所示。
2 多線程多隊列的負載均衡算法研究
2.1 研究現(xiàn)狀
多線程之間的負載均衡問題是系統(tǒng)的一個研究重點。
一般地,負載均衡機制主要包括兩大部分:信息策略和定位策略。
(1)信息策略可描述網(wǎng)絡存儲資源的使用狀況。描述負載信息所采用的參數(shù)有:運行隊列中的任務數(shù)和存儲占用情況等。
(2)定位策略:指如何選擇網(wǎng)絡存儲服務器來接受客戶端的網(wǎng)絡存儲任務請求。即調(diào)度算法,如輪轉(zhuǎn)調(diào)度、加權(quán)輪轉(zhuǎn)、最少鏈接和目標地址散列等。
本系統(tǒng)主要運用信息策略、主動管理和分配運行的隊列和線程,從而實現(xiàn)對各線程之間的負載均衡,并達到限制網(wǎng)速和帶寬的目的。此外,本系統(tǒng)采用的是單服務器端,而不是集群服務器。所以在算法和設計上不能遵循傳統(tǒng)的集群服務器關(guān)于負載均衡的理論和思想。
2.2 本系統(tǒng)采用的負載均衡算法
目前負載均衡技術(shù)采用的算法有:輪循均衡、權(quán)重輪循均衡、隨機均衡、響應速度均衡、最少連接數(shù)均衡和處理能力均衡等[2]。本文提出一種基于隊列管理的負載均衡算法。其算法思想如下。
對于來自每個客戶端的請求消息,根據(jù)隊列的數(shù)量進行響應:
(1)當客戶端數(shù)為0時,設新客戶端為A,則A的線程數(shù)為TNMAX,A的帶寬為BLMAX;
(2)當客戶端數(shù)為1時,B的線程數(shù)為A的線程數(shù)的一半取下限,A的線程數(shù)為其本身的線程數(shù)一半取上限;客戶端數(shù)增為2;
(3)當客戶端數(shù)為2時,C的線程數(shù)為A,B線程數(shù)的最大值的一半取下限,修改A的值;客戶端數(shù)增為3。其他情況類似;
(4)當客戶端數(shù)為5時,則回應等待。
計算公式:TNi=f(CN,TNMAX,BL)
其中,參數(shù)TNi是分配給客戶端的線程數(shù);BL是服務器端Linux操作系統(tǒng)安裝的帶寬,這里為100 Mbps;TNMAX=5,是線程總數(shù)的上限值(根據(jù)環(huán)境影響和實際情況等,可擴充);標志位CN用來顯示當前連接的客戶端數(shù)目,設定初值為0。
下面列舉實例,加以說明。
初值表示為:BL=100Mbps,TNMAX=5,CN=0;
如果有客戶端A來申請連接時,則返回當前可用的線程數(shù),更新標志位:
TNA1=5,CN=1;
當連接和發(fā)送過程中,有另一新客戶端B申請連接時,則更新標志位:
TNA2=3,TNB2=2,CN=2;
這里采用的算法是,由于B從A得到A線程數(shù)的一半并取下限,A取得本身線程數(shù)一半的上限。計算公式為:
TNB2=TNA1/2(取下限),TNA2=TNA1/2(取上限)
當有新客戶端C申請連接時,則更新標志位和客戶端數(shù):
TNA3=2,TNB3=2,TNC3=1,CN=3;
計算方法是首先比較A和B的線程數(shù),取值大的分配給線程C,計算公式為:
TNC3=MAX(TNA2,TNB2)/2(取下限),TNA3=TNA2-TNC3
以次類推,當有客戶D申請分配線程時,
TNA4=1,TNB4=2,TNC4=1,TND4=1,CN=4;
這里當A和B線程數(shù)相等時,客戶D仍是從客戶A分配到一個線程。
當有新客戶端E申請連接時,則更新標志位和客戶端數(shù):
TNA5=1,TNB5=1,TNC5=1,TND5=1,TNE5=1,CN=5;
計算方法是首先比較A和B的線程數(shù),取值大的分配給線程E,計算公式為:
TE5=MAX(TNA4,TNB4)/2(取下限)
這是把5個線程分配給若干客戶端的過程,實現(xiàn)了多個線程的負載平衡,并限制客戶的帶寬。
設計模式:當客戶端發(fā)出請求后,如果服務器端回應“等待(wait)”,則已經(jīng)沒有可用線程,客戶輪詢等待;若服務器端回應“發(fā)送(send)”,客戶開始詢問服務器端的可用線程數(shù),服務器端回應可用的線程數(shù),后臺進行壓縮和多線程處理,開始自動上傳。
本文提出了一種改進的并發(fā)服務器模型,這種服務器模型能更好地處理進程調(diào)度,實現(xiàn)了隊列之間的負載均衡,增強了系統(tǒng)的可靠性。
參考文獻
1 岑駕科,邵秀麗.負載均衡策略及可擴展存儲資源預約協(xié)議.計算機工程與應用,2005;41(7):157~159
2 彭德巍,何炎祥.基于Agent的負載均衡框架應用研究.計算機工程與應用,2005;41(5):153~155