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