《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動態(tài) > 基于主動隊列管理的Linux并發(fā)服務(wù)器模型及負(fù)載均衡算法的研究

基于主動隊列管理的Linux并發(fā)服務(wù)器模型及負(fù)載均衡算法的研究

2008-05-05
作者:黃偉志1,湯 莉2,劉 軍3

  摘 要: 提出了一種基于主動隊列管理的并發(fā)服務(wù)器模型,在主動隊列管理的并發(fā)服務(wù)器模型下,研究了服務(wù)器對各隊列、各線程運用負(fù)載均衡" title="負(fù)載均衡">負(fù)載均衡的策略和算法。
  關(guān)鍵詞: 并發(fā)服務(wù)器 負(fù)載均衡 主動隊列管理


  互聯(lián)網(wǎng)用戶數(shù)和網(wǎng)絡(luò)流量的幾何級數(shù)增長對網(wǎng)絡(luò)服務(wù)器的可用性提出了更高要求。當(dāng)網(wǎng)絡(luò)數(shù)據(jù)流不能在各服務(wù)器之間有效分配時,會出現(xiàn)負(fù)載失衡。
  針對該問題,本文在單服務(wù)器模式下,通過合理分配線程、協(xié)調(diào)隊列、采用單服務(wù)器主動管理隊列等方法實現(xiàn)了多線程多任務(wù)下的負(fù)載均衡。
1 基于主動隊列管理的并發(fā)型服務(wù)器模型
1.1 服務(wù)器的分類和簡介

  在實際的網(wǎng)絡(luò)程序中,通常都是許多客戶機對應(yīng)一臺服務(wù)器。為處理客戶機的請求,對服務(wù)端的程序提出了特殊要求。目前最常用的服務(wù)器模型分為兩種:(1)循環(huán)服務(wù)器,在同一個時刻僅響應(yīng)一個客戶端" title="客戶端">客戶端的請求;(2)并發(fā)服務(wù)器,在同一個時刻可響應(yīng)多個客戶端請求。
  循環(huán)服務(wù)器包括數(shù)據(jù)報協(xié)議(UDP)服務(wù)器和傳輸控制協(xié)議(TCP)服務(wù)器。實現(xiàn)非常簡單:數(shù)據(jù)報協(xié)議服務(wù)器每次從套接字上讀取一個客戶端的請求進(jìn)行處理,然后將結(jié)果返回給客戶機;傳輸控制協(xié)議服務(wù)器接受一個客戶端的連接請求,然后處理,完成了該客戶的所有請求后,斷開連接。
  并發(fā)服務(wù)器的思想是每個客戶機的請求不由服務(wù)器直接處理,而是服務(wù)器創(chuàng)建一個子進(jìn)程來處理。這樣可以使服務(wù)器進(jìn)程在同一時間有多個子進(jìn)程與不同的客戶程序連接和通信。在客戶程序看來,服務(wù)器可以并發(fā)地處理多個客戶的請求。
  一般TCP/IP服務(wù)器通信軟件" title="通信軟件">通信軟件均為并發(fā)型,即由一個守護(hù)進(jìn)程負(fù)責(zé)監(jiān)聽客戶機的連接請求,并生成一個或多個子進(jìn)程與客戶機建立連接,以完成通信。其缺點是隨著連接客戶機數(shù)量的增多,生成的通信子進(jìn)程數(shù)量也會隨之增多,在客戶機數(shù)量較多的應(yīng)用場合勢必影響服務(wù)器的運行效率。一般的循環(huán)服務(wù)是指服務(wù)器在接收客戶機的連接請求后即與之建立連接,只有處理完與客戶機的通信任務(wù)后,才能再去接收另一客戶機的請求連接。其優(yōu)點是不必生成通信子進(jìn)程。缺點是客戶機在每次通信之前都要與服務(wù)器建立連接,開銷過大,不能用于隨機的數(shù)據(jù)通信和繁忙的業(yè)務(wù)處理。
1.2 模型的提出
  本文提出了一種新型的基于主動隊列管理的并發(fā)型服務(wù)器通信軟件的設(shè)計方法,不同于一般的并發(fā)型服務(wù)器和循環(huán)型服務(wù)器通信軟件,它摒棄了上述兩類服務(wù)器的缺點,綜合其優(yōu)點。該軟件的優(yōu)點是:生成子進(jìn)程數(shù)目少;設(shè)定了子線程的上限值;繼承了并發(fā)通信的優(yōu)點,容易對客戶機與服務(wù)器的連接進(jìn)行管理;適用于客戶機數(shù)量較多和隨機數(shù)據(jù)通信的情況,能夠有效地提高服務(wù)器的運行效率。服務(wù)器系統(tǒng)模型圖如圖1所示。


  這種設(shè)計方法的基本思想是:首先設(shè)置服務(wù)器子線程數(shù)的上限值TNMAX,避免子線程數(shù)過多,影響效率。然后將服務(wù)器設(shè)為監(jiān)聽狀態(tài)。當(dāng)?shù)谝慌_客戶機C1向服務(wù)器請求連接時,服務(wù)器的守護(hù)進(jìn)程與之建立初始連接L0,客戶機利用L0向服務(wù)器發(fā)送IP地址和端口號" title="端口號">端口號,守護(hù)進(jìn)程將客戶機的IP地址和端口號登記在共享內(nèi)存的記錄中,然后關(guān)閉L0。由守護(hù)進(jìn)程生成的一個通信子進(jìn)程Pc1,從共享內(nèi)存中獲得客戶機IP地址及端口號后,建立一個與客戶機的連接L1,準(zhǔn)備進(jìn)行讀寫,并分配可用的線程數(shù),同時設(shè)置當(dāng)前與服務(wù)器連接的客戶端數(shù),設(shè)置分配給它的線程數(shù)。守護(hù)進(jìn)程繼續(xù)監(jiān)聽來自客戶端的連接。當(dāng)另一臺客戶機C2請求連接時,將客戶機IP地址和端口號同樣登記在共享內(nèi)存中。守護(hù)進(jìn)程再生成一個通信子進(jìn)程Pc2,建立與客戶機的連接L2,然后添加隊列,分配可用線程數(shù),同時更新服務(wù)器記錄的客戶端數(shù)和各自對應(yīng)分配的線程數(shù)。這樣逐一連接客戶端,生成通信子進(jìn)程,添加隊列,直至達(dá)到子線程數(shù)的上限值。當(dāng)達(dá)到上限值TNMAX時,若再有客戶機連接,則服務(wù)器回復(fù)消息令其等待,客戶機輪詢直至被分配到線程。當(dāng)某個客戶端傳輸完畢時,刪除隊列,刪除分配的線程數(shù),終止子進(jìn)程,并更新服務(wù)器的記錄。這樣做不僅發(fā)揮了并發(fā)服務(wù)器的優(yōu)點,且避免了子進(jìn)程過多的缺點。服務(wù)器通過主動的隊列管理機制實現(xiàn)對多個客戶端的協(xié)調(diào)和處理,極大地提高了運行效率。
1.3 進(jìn)程管理的實現(xiàn)
  在本系統(tǒng)中,服務(wù)器采用基于主動消息隊列管理的并發(fā)服務(wù)器模型。并發(fā)服務(wù)器的引入是與進(jìn)程密切相關(guān)的,且Linux的進(jìn)程管理也非常符合并發(fā)服務(wù)器的工作原理。本系統(tǒng)實現(xiàn)Linux服務(wù)器端的通信和進(jìn)程管理,步驟如下:
  (1)服務(wù)器端打開一個已知的監(jiān)聽端口;
  (2)在監(jiān)聽端口上監(jiān)聽客戶機的連接請求,當(dāng)有一客戶機請求連接時,建立連接線路并返回通信文件描述符" title="描述符">描述符;
  (3)父進(jìn)程創(chuàng)建一子進(jìn)程,父進(jìn)程關(guān)閉通信文件描述符,并繼續(xù)監(jiān)聽端口上的客戶機連接請求;
  (4)子進(jìn)程通過通信文件描述符與客戶機進(jìn)行通信,通信結(jié)束后終止子進(jìn)程,并關(guān)閉通信文件描述符。
  系統(tǒng)服務(wù)器端管理流程圖如圖2所示。


2 多線程多隊列的負(fù)載均衡算法研究
2.1 研究現(xiàn)狀

  多線程之間的負(fù)載均衡問題是系統(tǒng)的一個研究重點。
  一般地,負(fù)載均衡機制主要包括兩大部分:信息策略和定位策略。
  (1)信息策略可描述網(wǎng)絡(luò)存儲資源的使用狀況。描述負(fù)載信息所采用的參數(shù)有:運行隊列中的任務(wù)數(shù)和存儲占用情況等。
  (2)定位策略:指如何選擇網(wǎng)絡(luò)存儲服務(wù)器來接受客戶端的網(wǎng)絡(luò)存儲任務(wù)請求。即調(diào)度算法,如輪轉(zhuǎn)調(diào)度、加權(quán)輪轉(zhuǎn)、最少鏈接和目標(biāo)地址散列等。
  本系統(tǒng)主要運用信息策略、主動管理和分配運行的隊列和線程,從而實現(xiàn)對各線程之間的負(fù)載均衡,并達(dá)到限制網(wǎng)速和帶寬的目的。此外,本系統(tǒng)采用的是單服務(wù)器端,而不是集群服務(wù)器。所以在算法和設(shè)計上不能遵循傳統(tǒng)的集群服務(wù)器關(guān)于負(fù)載均衡的理論和思想。
2.2 本系統(tǒng)采用的負(fù)載均衡算法
  目前負(fù)載均衡技術(shù)采用的算法有:輪循均衡、權(quán)重輪循均衡、隨機均衡、響應(yīng)速度均衡、最少連接數(shù)均衡和處理能力均衡等[2]。本文提出一種基于隊列管理的負(fù)載均衡算法。其算法思想如下。
  對于來自每個客戶端的請求消息,根據(jù)隊列的數(shù)量進(jìn)行響應(yīng):
  (1)當(dāng)客戶端數(shù)為0時,設(shè)新客戶端為A,則A的線程數(shù)為TNMAX,A的帶寬為BLMAX
  (2)當(dāng)客戶端數(shù)為1時,B的線程數(shù)為A的線程數(shù)的一半取下限,A的線程數(shù)為其本身的線程數(shù)一半取上限;客戶端數(shù)增為2;
  (3)當(dāng)客戶端數(shù)為2時,C的線程數(shù)為A,B線程數(shù)的最大值的一半取下限,修改A的值;客戶端數(shù)增為3。其他情況類似;
  (4)當(dāng)客戶端數(shù)為5時,則回應(yīng)等待。
  計算公式:TNi=f(CN,TNMAX,BL)
  其中,參數(shù)TNi是分配給客戶端的線程數(shù);BL是服務(wù)器端Linux操作系統(tǒng)安裝的帶寬,這里為100 Mbps;TNMAX=5,是線程總數(shù)的上限值(根據(jù)環(huán)境影響和實際情況等,可擴充);標(biāo)志位CN用來顯示當(dāng)前連接的客戶端數(shù)目,設(shè)定初值為0。
  下面列舉實例,加以說明。
  初值表示為:BL=100Mbps,TNMAX=5,CN=0;
  如果有客戶端A來申請連接時,則返回當(dāng)前可用的線程數(shù),更新標(biāo)志位:
  TNA1=5,CN=1;
  當(dāng)連接和發(fā)送過程中,有另一新客戶端B申請連接時,則更新標(biāo)志位:
  TNA2=3,TNB2=2,CN=2;
  這里采用的算法是,由于B從A得到A線程數(shù)的一半并取下限,A取得本身線程數(shù)一半的上限。計算公式為:
  TNB2=TNA1/2(取下限),TNA2=TNA1/2(取上限)
  當(dāng)有新客戶端C申請連接時,則更新標(biāo)志位和客戶端數(shù):
  TNA3=2,TNB3=2,TNC3=1,CN=3;
  計算方法是首先比較A和B的線程數(shù),取值大的分配給線程C,計算公式為:
  TNC3=MAX(TNA2,TNB2)/2(取下限),TNA3=TNA2-TNC3
  以次類推,當(dāng)有客戶D申請分配線程時,
  TNA4=1,TNB4=2,TNC4=1,TND4=1,CN=4;
  這里當(dāng)A和B線程數(shù)相等時,客戶D仍是從客戶A分配到一個線程。
  當(dāng)有新客戶端E申請連接時,則更新標(biāo)志位和客戶端數(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ù)載平衡,并限制客戶的帶寬。
  設(shè)計模式:當(dāng)客戶端發(fā)出請求后,如果服務(wù)器端回應(yīng)“等待(wait)”,則已經(jīng)沒有可用線程,客戶輪詢等待;若服務(wù)器端回應(yīng)“發(fā)送(send)”,客戶開始詢問服務(wù)器端的可用線程數(shù),服務(wù)器端回應(yīng)可用的線程數(shù),后臺進(jìn)行壓縮和多線程處理,開始自動上傳。
  本文提出了一種改進(jìn)的并發(fā)服務(wù)器模型,這種服務(wù)器模型能更好地處理進(jìn)程調(diào)度,實現(xiàn)了隊列之間的負(fù)載均衡,增強了系統(tǒng)的可靠性。
參考文獻(xiàn)
1 岑駕科,邵秀麗.負(fù)載均衡策略及可擴展存儲資源預(yù)約協(xié)議.計算機工程與應(yīng)用,2005;41(7):157~159
2 彭德巍,何炎祥.基于Agent的負(fù)載均衡框架應(yīng)用研究.計算機工程與應(yīng)用,2005;41(5):153~155

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。