幸福,楊峰,燕霄翔,王文志
中國礦業(yè)大學(北京)機電與信息工程學院計算機科學與技術(shù)系,北京 100083
Linux服務(wù)器下多網(wǎng)口負載均衡算法的研究
幸福,楊峰,燕霄翔,王文志
中國礦業(yè)大學(北京)機電與信息工程學院計算機科學與技術(shù)系,北京 100083
近年來,隨著web2.0高速普及和web3.0興起,帶來了大量的數(shù)據(jù)信息和文件資料的產(chǎn)生,從而導(dǎo)致網(wǎng)絡(luò)業(yè)務(wù)數(shù)據(jù)量的急劇提高和多客戶端的訪問量快速增長。在這樣的背景下,網(wǎng)絡(luò)存儲架構(gòu)需要有一個可靠穩(wěn)定的后端存儲服務(wù)來支撐,因此如何保持網(wǎng)絡(luò)存儲服務(wù)器的高可用性至關(guān)重要。由于單網(wǎng)口網(wǎng)絡(luò)吞吐力有限,成為制約整個系統(tǒng)性能的瓶頸。如果單靠對網(wǎng)卡硬件升級來增加網(wǎng)絡(luò)帶寬,其性價比不高。為實現(xiàn)這些要求,現(xiàn)在Linux服務(wù)器大多是采用多網(wǎng)卡配置。利用鏈路聚合技術(shù)[1],將服務(wù)器的多個網(wǎng)口綁定成一個虛擬網(wǎng)卡能有效提高服務(wù)器的網(wǎng)絡(luò)吞吐率及高可靠性。
由于客戶端對服務(wù)器存取數(shù)據(jù)的需求逐漸增大,網(wǎng)口負載常常超過它的最大處理能力,網(wǎng)絡(luò)發(fā)生擁塞的可能性越來越大,造成數(shù)據(jù)傳輸速度下降,讀寫性能衰減。如果不對綁定的多網(wǎng)口負載進行有效的控制和在網(wǎng)卡負載過重時使網(wǎng)口能及時恢復(fù)到正常的狀態(tài),就會造成嚴重的網(wǎng)絡(luò)擁塞,甚至導(dǎo)致網(wǎng)絡(luò)崩潰。因此,多網(wǎng)口負載均衡的研究與實現(xiàn)越來越重要[2]。
Linux的2.4.x以上內(nèi)核Bonding模塊實現(xiàn)了一個聚合的方法,它將多個物理網(wǎng)口聚合為一個單一虛擬網(wǎng)口,同時通過六種算法模式來提供負載均衡和網(wǎng)絡(luò)冗余服務(wù)。由于Linux Bonding技術(shù)的不對稱性[3],對于接收數(shù)據(jù)的負載均衡只是利用ARP協(xié)商機制實現(xiàn),本文針對此算法的研究分析,指出其實際存在的缺陷不足,提出另外一種在此基礎(chǔ)上改進的算法,即基于適應(yīng)性負載均衡的動態(tài)接收算法的實現(xiàn)方法。并進行了實際測試驗證。
表1 Netfilter相關(guān)參數(shù)說明
2.1 負載均衡技術(shù)
負載均衡[4]主要思想就是如何根據(jù)某種算法將網(wǎng)絡(luò)的業(yè)務(wù)流量平均分配到不同的服務(wù)器和網(wǎng)絡(luò)設(shè)備上去,以減輕單臺服務(wù)器和網(wǎng)絡(luò)設(shè)備的負擔,從而提高整個系統(tǒng)的效率。
負載均衡分為靜態(tài)均衡和動態(tài)均衡[5]。靜態(tài)均衡通過平均分配任務(wù)給計算設(shè)備節(jié)點,雖然能獲得最優(yōu)負載均衡結(jié)果。但這種方法要求任務(wù)量必須是確定的值,在現(xiàn)實網(wǎng)路中任務(wù)量是隨時間的變化而變化的,很難做到任務(wù)量確定。動態(tài)均衡方法通過實時分析計算設(shè)備節(jié)點的負載狀況和任務(wù)量,選取負載最輕的節(jié)點提供服務(wù)。
2.2 Linux內(nèi)核Bonding技術(shù)的實現(xiàn)
Linux的Bonding技術(shù)通過在數(shù)據(jù)鏈路層與網(wǎng)卡驅(qū)動層之間實現(xiàn)一個虛擬層[6],服務(wù)器接在交換機上的多個網(wǎng)口被綁定為一個虛擬網(wǎng)口,進而構(gòu)成一個虛擬的網(wǎng)卡。服務(wù)器在收發(fā)數(shù)據(jù)時,服務(wù)器上的虛擬網(wǎng)卡接到請求后,根據(jù)某種算法來決定由誰處理數(shù)據(jù)的傳輸。
目前Bonding模塊中已經(jīng)實現(xiàn)了六種算法[7],即輪轉(zhuǎn)算法(balance-rr)、主備份算法(active-backup)、異或算法(balance-xor)、廣播算法(broadcast)、傳輸負載均衡算法(balance-tlb)和適應(yīng)性負載均衡算法(balance-alb),其中前五種算法只能處理發(fā)送數(shù)據(jù)的負載均衡,最后一種算法能夠處理發(fā)送和接收數(shù)據(jù)的負載均衡。
2.3 Linux內(nèi)核Netfilter架構(gòu)
Netfilter[8]是Linux內(nèi)核的一個子系統(tǒng),它的架構(gòu)就是在整個網(wǎng)絡(luò)流程放置了5個hook檢測點,而在每個檢測點上登記了一些處理函數(shù)進行處理,如數(shù)據(jù)包過濾、數(shù)據(jù)包處理、和基于狀態(tài)的過濾等。Netfilter的關(guān)鍵參數(shù)見表1。
3.1 算法原理的研究
適應(yīng)性負載均衡算法的原理采用輪換分配Bonding設(shè)備中多個網(wǎng)口的MAC地址。當雙方建立通信時,服務(wù)器端通過發(fā)送ARP廣播報文通知對端,當ARP應(yīng)答從對端到達時,Bonding驅(qū)動把對端的信息從ARP包中復(fù)制并保存下來,并發(fā)起一個ARP應(yīng)答讓對端的ARP緩存記錄服務(wù)器端本次分配出的網(wǎng)口MAC地址。同時通過給所有的對端發(fā)送更新(ARP應(yīng)答包)來解決ARP廣播請求帶來的物理網(wǎng)段中的對端ARP緩存記錄覆蓋的問題。ARP應(yīng)答包中包含了服務(wù)器端Bonding設(shè)備分配給所有對端的唯一MAC地址。
3.2 算法性能缺陷的研究
此算法的設(shè)計只是一種通過預(yù)先靜態(tài)分配網(wǎng)口來實現(xiàn)接收流量的負載均衡的算法,但是在實際的復(fù)雜網(wǎng)絡(luò)環(huán)境下,客戶端機往往數(shù)量很多。在實際測試中發(fā)現(xiàn),當出現(xiàn)分配到同一MAC地址的客戶端同時向服務(wù)器寫數(shù)據(jù)時,他們只會根據(jù)自己本地ARP緩存記錄的服務(wù)器網(wǎng)口MAC地址發(fā)送數(shù)據(jù),而不管此網(wǎng)口負載情況,這樣就會造成服務(wù)器Bonding設(shè)備的網(wǎng)口中出現(xiàn)“一忙多閑”的現(xiàn)象。同時如果對同一網(wǎng)口傳輸?shù)目蛻舳瞬粩嘣黾踊蛘邆鬏敂?shù)據(jù)速度升高,導(dǎo)致此網(wǎng)口負載加重,超過網(wǎng)口最大傳輸速度,網(wǎng)口內(nèi)的每個客戶端IP流量的傳輸速度就會急劇下降,這樣造成網(wǎng)絡(luò)I/O性能的降低,影響服務(wù)器寫性能。
4.1 算法描述實現(xiàn)
基于適應(yīng)性負載均衡的動態(tài)接收算法的核心原理是:通過Bonding模塊里的鏈路監(jiān)控函數(shù)周期性地監(jiān)控Bonding中的每個slave網(wǎng)口流量總和,監(jiān)控采用循環(huán)Bonding中的所有網(wǎng)口,通過3 s采樣,即3 s內(nèi)每一秒計算一次每個網(wǎng)口流量情況,當發(fā)現(xiàn)有某個網(wǎng)口流量和在3 s內(nèi)有2次超過網(wǎng)口工作最大闕值,就判定此網(wǎng)口高負載,觸發(fā)調(diào)用調(diào)整策略。調(diào)整策略會將此網(wǎng)口內(nèi)的所有IP流量分攤到剩余Bonding中的其他空閑網(wǎng)口中,使整個Bonding設(shè)備內(nèi)的多網(wǎng)口實現(xiàn)接收數(shù)據(jù)負載均衡。算法主要流程圖如圖1所示。
圖1 適應(yīng)性負載均衡動態(tài)接收算法操作流程
客戶端的信息保存在一個以IP為哈希鍵的結(jié)構(gòu)體數(shù)組中,將前一秒此客戶端接收到的數(shù)據(jù)長度總和rx_history記錄下來,同時在鏈路監(jiān)控函數(shù)中每秒獲取一次當前客戶端接收到的數(shù)據(jù)長度總和rx_bytes,將兩者相減得到客戶端當前時刻的傳輸速度rx_second。
本算法中的關(guān)鍵參數(shù)說明:
(1)網(wǎng)口闕值。考慮到網(wǎng)卡實際帶寬的處理能力,設(shè)定網(wǎng)口最大工作能力為理論最大傳輸速度的80%。
(2)3 s采樣。在網(wǎng)絡(luò)流量很大的情況下經(jīng)常會由于cpu調(diào)度中斷導(dǎo)致當前時刻從網(wǎng)卡驅(qū)動到的數(shù)據(jù)為零,因此采用3 s采樣的方法來避免數(shù)據(jù)錯誤導(dǎo)致的監(jiān)控失效。
4.2 客戶端IP流量的統(tǒng)計
客戶端向服務(wù)器傳輸數(shù)據(jù)是基于IP流傳輸,單個網(wǎng)口高負載正是由于此網(wǎng)口接收到的IP流增多,傳輸流量總和超過其最大處理能力,導(dǎo)致每個IP流傳輸速度下降。因此,為了能動態(tài)地對負載網(wǎng)口內(nèi)的所有基于客戶端IP流調(diào)整,需要實時獲取每個客戶端IP流速率,這樣才能實現(xiàn)動態(tài)地將當前負載網(wǎng)口中的IP流量調(diào)整到空閑或者負載低的其他剩余網(wǎng)口中。為此,在Bonding模塊中加入Netfilter技術(shù)。當加載Bonding模塊的算法時,算法初始化函數(shù)在NF_IP_LOCAL_IN點會注冊一個鉤子函數(shù),當經(jīng)路由查找后送往本機的數(shù)據(jù)包經(jīng)過此處時觸發(fā)鉤子函數(shù)。
此鉤子函數(shù)主要功能是:對確定接收為本機的數(shù)據(jù)包每當經(jīng)過此注冊點時,就通過NF_HOOK回調(diào)函數(shù)進入此自定義函數(shù),然后將此數(shù)據(jù)包IP頭取出,以源IP地址為哈希key值在客戶端結(jié)構(gòu)體鏈表中查找出Bonding中登記的客戶端信息,當查找成功后再通過累加的方式統(tǒng)計此客戶端接收數(shù)據(jù)包流量總值rx_bytes。函數(shù)返回NF_ACCEPT完成數(shù)據(jù)包的統(tǒng)計工作。
由于內(nèi)核處理速度很快,此數(shù)據(jù)統(tǒng)計過程額外的開銷可以忽略不計,不會對網(wǎng)絡(luò)數(shù)據(jù)傳輸造成影響。
4.3 調(diào)整策略
調(diào)整策略的主要思路是:首先會從客戶端接收哈希鏈表中查找出此負載網(wǎng)口中當前正在傳輸?shù)腘個客戶端,由于同一網(wǎng)段網(wǎng)口之間總是會有流量很小的測試報文在接收,對網(wǎng)口傳輸性能無影響,基于實際考慮,定義客戶端數(shù)據(jù)傳輸?shù)淖钚∷俾蕿? KB/s,低于此值的客戶端IP流量全部忽略,不作為調(diào)整的N個客戶端之內(nèi)。
當N為1時,表示此網(wǎng)口中只有一個客戶端在傳輸數(shù)據(jù),定義這樣的客戶端IP流為單個大流量,這是不需要調(diào)整出去的;否則將N個客戶端IP流按當前傳輸速度從大到小的順序排序,再循環(huán)這些客戶端IP流,按照選擇最優(yōu)網(wǎng)口原則最大程度地將每個IP流分配到Bonding中的其他網(wǎng)口上去,分配調(diào)整的方法是通過本機發(fā)送ARP學習更新包,讓客戶端更新自己的ARP緩存表信息。
選擇最優(yōu)網(wǎng)口原則如下:
(1)當客戶端中無單個最大流量時只循環(huán)N-1次,否則就循環(huán)N次。
(2)當客戶端是單個最大流量時跳過此客戶端循環(huán)下一個。
(3)當選擇最優(yōu)網(wǎng)口時不滿足以下3點,跳過此客戶端循環(huán)下一個:
①最優(yōu)網(wǎng)口為當前負載最輕的網(wǎng)口;
②客戶端IP流分配到新的網(wǎng)口后不會造成最優(yōu)網(wǎng)口超過負載閥值;
③客戶端IP流的速度小于高負載的網(wǎng)口與最優(yōu)網(wǎng)口流量總和差值;
(4)當選擇的最優(yōu)網(wǎng)口等于高負載的網(wǎng)口時,立即終止循環(huán)。
4.4 算法復(fù)雜度分析
新算法主要增加了周期性監(jiān)控所有Bonding網(wǎng)口,客戶端IP流量統(tǒng)計和動態(tài)調(diào)整負載網(wǎng)口3個模塊。
周期性監(jiān)控模塊中每秒更新所有客戶端的流量信息,查找客戶端時間復(fù)雜度為O(n)。
客戶端IP流量統(tǒng)計只是對單一數(shù)據(jù)包處理,其時間復(fù)雜度為O(1)。
檢查所有網(wǎng)口的時間復(fù)雜度為O(n)。當觸發(fā)調(diào)整函數(shù)后,篩選出需要調(diào)整的客戶端,時間復(fù)雜度為O(n),然后會對需要調(diào)整的客戶端根據(jù)IP流速率大小排序,排序算法采用快速排序,時間復(fù)雜度為O(nlbn),最后將排好序的IP流遷移到最優(yōu)網(wǎng)口,時間復(fù)雜度為O(n)。新算法時間復(fù)雜度為Ο(n+1+n(n+nlbn+n))=Ο(n2(2+lbn)+n+1)=Ο(n2lbn)。
受硬件的制約,單臺服務(wù)器能夠支持的網(wǎng)卡數(shù)量有限,目前市場上的高性能存儲服務(wù)器最多也只能支持20個網(wǎng)口,而內(nèi)核Bonding模塊最大支持客戶端數(shù)為256。按照上面的時間復(fù)雜度公式,該算法在每次監(jiān)控網(wǎng)口時最多執(zhí)行次數(shù)為20+1+20×(256+256×lb256+256)=51 221次。在面對網(wǎng)路數(shù)據(jù)傳輸高負荷的情況下,該算法執(zhí)行效率很高。
為了驗證算法性能,在此給出在Bonding模塊實現(xiàn)階段對改進算法的測試實驗結(jié)果,通過搭建的模擬復(fù)雜環(huán)境對改進前后的算法進行流量測試。需要先將修改的Bonding模塊內(nèi)核編譯,執(zhí)行加載命令:modprobe bonding mode= 6 miimon=100,加載修改后的bonding模塊,調(diào)度算法為適應(yīng)性動態(tài)接收算法。
測試軟件環(huán)境:SUSE Linux11(內(nèi)核2.6.27.19)。
測試硬件環(huán)境:一臺服務(wù)器S(2塊支持MII狀態(tài)字寄存器的千兆網(wǎng)卡,每個網(wǎng)卡上有一個網(wǎng)口,即eth0和eth1);一臺千兆交換機;4臺客戶機(千兆網(wǎng)卡)C1,C2,C3,C4;服務(wù)器和客戶機與交換機相連。
測試軟件:Netperf。Netperf是一種網(wǎng)絡(luò)性能的測量工具,可以模擬出需要的傳輸速度來進行實驗。
測試步驟:首先服務(wù)器S按上面的命令加載Bonding模塊,接著通過修改服務(wù)器/ete/sysconfig/network-script下的網(wǎng)口配置文件將2個網(wǎng)口綁定成一個虛擬網(wǎng)口Bond1,然后讓C1~C4客戶機與服務(wù)器通信,查看客戶機ARP緩存表信息可知,C1和C3記錄S網(wǎng)口0的MAC地址,C2和C4記錄S網(wǎng)口1的MAC地址。接著進行3次模擬測試,第一次C1向服務(wù)器發(fā)送文件,第二次C3向服務(wù)器發(fā)送文件,第三次C1和C3同時向服務(wù)器發(fā)送文件。測試結(jié)果見表2。
表2 測試結(jié)果
根據(jù)以上實驗結(jié)果得知:當同時有多個客戶機向服務(wù)器發(fā)送數(shù)據(jù)時,適應(yīng)性負載均衡算法不會根據(jù)網(wǎng)口負載情況作出相應(yīng)調(diào)整,導(dǎo)致網(wǎng)口eth0滿負荷工作,而網(wǎng)口eth1卻空閑沒得到利用,實際吞吐率僅為112.7 Mb/s,負載均衡失效。而改進的適應(yīng)性動態(tài)接收算法會根據(jù)網(wǎng)口實際負載情況,當發(fā)現(xiàn)網(wǎng)口高負荷后,實時動態(tài)地調(diào)整客戶端的傳輸通道,吞吐率達到161.6 Mb/s,新算法比原算法吞吐率提高43%。新算法大大提高了服務(wù)器網(wǎng)絡(luò)吞吐量和網(wǎng)口利用率,實現(xiàn)多網(wǎng)口動態(tài)負載均衡。
本文針對Linux Bonding模式6下會出現(xiàn)寫性能下降的問題,通過對該算法進行研究介紹,分析其存在的缺陷不足,并詳細描述了基于適應(yīng)性負載均衡的動態(tài)接收算法的實現(xiàn)流程和關(guān)鍵技術(shù),最后通過實際測試對新算法性能進行驗證。該算法能高效處理復(fù)雜網(wǎng)絡(luò)環(huán)境下多網(wǎng)口服務(wù)器接收數(shù)據(jù)負載均衡的問題。然而目前Bonding技術(shù)只能通過ARP協(xié)商機制來實現(xiàn)接收負載均衡,這要求客戶端必須在同一物理網(wǎng)段,因此有必要進一步研究和改進。
[1]胡修林,王運鵬,郭輝.多網(wǎng)卡鏈路綁定策略的研究與實現(xiàn)[J].小型微型計算機系統(tǒng),2005(2).
[2]Zhang Wensong,Jin Shiyao,Wu Quanyuan.Linux director:a connection router for scalable internet services[J].Journal of Computer Science&Technology,2000,15(6):560-571.
[3]石磊.多網(wǎng)卡bonding技術(shù)的研究與實現(xiàn)[D].長沙:國防科技大學,2005.
[4]路明懷,龔正虎.Linux服務(wù)器下多網(wǎng)卡負載均衡的研究與實現(xiàn)[J].計算機與信息技術(shù),2006(6).
[5]羅擁軍,李曉樂,孫如祥.負載均衡算法綜述[J].科技情報開發(fā)與經(jīng)濟,2008(18).
[6]毛德操,胡希明.LINUX內(nèi)核源代碼情景分析[M].杭州:浙江大學出版社,2006.
[7]Davis T.Linux Ethernet bonding driver HOWTO[EB/OL]. [2011-12-10].http://www.kernel.org/doc/Documentation/networking/bonding.txt.
[8]劉建峰,潘軍,李祥和.Linux防火墻內(nèi)核中Netfilter和Iptables的分析[J].微計算機信息,2006,22(3):7-8.
XING Fu,YANG Feng,YAN Xiaoxiang,WANG Wenzhi
Department of Computer Science and Technology,School of Mechanical Electronic&Information Engineering,China University of Mining and Technology(Beijing),Beijing 100083,China
Network storage architecture requires a high reliability and high availability back-end storage server to provide network storage services,but the single Ethernet port configuration restricts the server data transfer performance.Linux kernel bonding technology has realized multiple physical network ports aggregate to a single virtual network port.But when receiving data,this technology just through the ARP consultation mechanism realizes statically distributing multiple network port,therefore performance defects exist in the practical.In view of this,after researching related technology and algorithm,this paper puts forward another improved algorithm,which is based on adaptive load balance dynamic receiving algorithm,and realizes this algorithm by netfilter technology and so on.The actual test verification is done.The new algorithm can significantly improve the multiple network port server transfer throughput rate while receiving data.
Linux bonding;load balancing;Address Resolution Protocol(ARP);netfilter
網(wǎng)絡(luò)存儲架構(gòu)需要一個高可靠性和高可用性的后端存儲服務(wù)器來提供網(wǎng)絡(luò)存儲服務(wù),而單網(wǎng)口配置制約了服務(wù)器數(shù)據(jù)傳輸性能。目前Linux內(nèi)核bonding技術(shù)已經(jīng)實現(xiàn)了將多個物理網(wǎng)口聚合為一個單一虛擬網(wǎng)口的方法。但這種不對稱的技術(shù)在實現(xiàn)接收數(shù)據(jù)負載均衡時,只是通過ARP協(xié)商機制實現(xiàn)靜態(tài)分配多網(wǎng)口,因此在實際應(yīng)用中存在性能上的缺陷。鑒于此,在對現(xiàn)有的相關(guān)技術(shù)和算法進行研究后,提出了另外一種在此基礎(chǔ)上改進的算法,即基于適應(yīng)性負載均衡的動態(tài)接收算法,利用netfilter等技術(shù)對此算法進行了實現(xiàn),進行了實際測試驗證。新算法能顯著提高多網(wǎng)口服務(wù)器接收數(shù)據(jù)時網(wǎng)絡(luò)傳輸吞吐率。
Linux bonding;負載均衡;地址解析協(xié)議;netfilter
A
TP316.81
10.3778/j.issn.1002-8331.1202-0265
XING Fu,YANG Feng,YAN Xiaoxiang,et al.Research of Linux server multiple Ethernet ports load balancing algorithm. Computer Engineering and Applications,2013,49(24):93-96.
國家自然基金儀器專項(No.50927805);十二五國家科技支撐計劃(No.2011BAK06B01,No.2011BAD04B05)。
幸福(1986—),男,碩士研究生,研究領(lǐng)域為計算機信息處理和計算機網(wǎng)絡(luò);楊峰,男,教授;燕霄翔,男,碩士研究生;王文志,男,碩士研究生。E-mail:xingfudage1986@126.com
2012-02-15
2012-04-23
1002-8331(2013)24-0093-04
CNKI出版日期:2012-06-15http://www.cnki.net/kcms/detail/11.2127.TP.20120615.1726.033.html