歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux集群 >> Linux集群之負載平衡原理和實現算法

Linux集群之負載平衡原理和實現算法

日期:2017/2/27 9:42:05   编辑:Linux集群

在計算機硬件價格下降、計算機網絡拓撲發展的情況下,分布式計算機系統給用戶提供了一個豐富的資源集合。人們在研究分布式系統時,就注意到了這樣一個問題:在一個由網絡連接起來的多計算機環境中,在某一時刻,一些計算機的負載比較重,而另外一些計算機的負載卻比較輕。平衡各計算機之間的負載是任務分配與調度的一個主要目標,它能夠提高整個系統的性能。

為了改善系統的性能,通過在多台計算機之間合理地分配負載,使各台計算機的負載基本均衡,這種計算能力共享的形式,通常被稱為負載平衡或負載共享。一般來說,"負載平衡"要達到的目標是使各台計算機之間的負載基本均衡,而"負載共享"意味著只是簡單的負載的重新分配。

負載平衡包括兩種,一種是靜態負載平衡,一種是動態負載平衡。只是利用系統負載的平均信息,而忽視系統當前的負載狀況的方法被稱為靜態負載平衡。根據系統當前的負載狀況來調整任務劃分的方法被稱為動態負載平衡。

導致負載不平衡主要是由於:

某些算法的迭代大小不是固定的,但迭代的大小在編譯時卻可以被求得; 某些算法的迭代大小不是固定的,並且迭代的大小依賴於被處理的數據,在編譯時無法求得; 即使迭代大小是固定的,也會有許多不定因素導致計算速度的差異。

考察這三個原因,對第一種情況可在編譯時估計各迭代的工作量,按照處理節點的處理能力分布迭代,這就是靜態負載平衡的方法。對第二、三種情況來說,必須采用動態負載平衡的手段,在運行過程中根據各個處理節點完成任務的情況,動態地遷移任務,實現動態負載平衡。進行動態負載平衡需要考察處理節點的處理能力,它的基本依據是根據處理節點先前的處理速度預見未來的處理速度。

負載平衡算法一個負載平衡算法都包含以下三個組成部分:

信息策略:制定任務放置策略的制定者使用的負載和任務量,以及信息分配的方式。 傳送策略:基於任務和計算機負載,判斷是否要把一個任務傳送到其它計算機上處理。 放置策略:對於適合傳送到其它計算機處理的任務,選擇任務將被傳送的目的計算機。

負載平衡的上述三個部分之間是以不同的方式相互作用的。放置策略利用信息策略提供的負載信息,僅當任務被傳送策略判斷為適於傳送之後才行動。

總之,負載平衡的目標是:提供最短的平均任務響應時間;能適於變化的負載;是可靠的負載平衡機制。

信息策略人們用來描述負載信息采用的參數有:

運行隊列中的任務數; 系統調用的速率; CPU上下文切換率; 空閒CPU時間百分比; 空閒存儲器的大小(K字節); 1分鐘內的平均負載。對於這些單個的負載描述參數,第(1)個,即采用運行隊列中的任務數作為描述負載的參數被證明是最有效的,即它的平均任務響應時間最短,並且已經得到廣泛應用。但是,如果為了使系統信息更全面而采集了更多的參數,則往往由於增加了額外開銷,卻得不到所希望的性能改善。例如,采用將六個參數中的某兩個進行"AND"或"OR"組合,得到的平均響應時間反而比單個參數的平均響應時間還要差一些。

傳送策略為了簡單起見,在選用傳送策略時,多選用閥值策略。例如,Eager等人的方法是:在判斷是否要在本地處理一個任務時,無需交換計算機之間的狀態信息,一旦服務隊列或等待服務隊列的長度大於閥值時,就傳送這個任務,而且傳送的是剛剛接收的任務。而進程遷移能夠遷移正在執行的任務,是對這種只能傳送剛剛接收的任務的一種改進。

Zhou在模擬研究七個負載平衡算法時,其傳送策略都采用閥值策略。它的閥值策略基於兩個閥值∶計算機的負載閥值Load和任務執行時間閥值TCPU。如果計算機的負載超過Load並且任務的執行時間超過TCPU時,就把此任務傳送到其它計算機執行。

放置策略經過總結,共有以下四種放置策略。

集中策略。每隔P秒,其中一個計算機被指定為"負載信息中心"(LIC),接受所有其它負載的變更值,並把它們匯集到一個"負載向量"中,然後把負載向量廣播給所有其它的計算機。當一台計算機認為一個任務適於傳送到其它計算機上執行時,它就給LIC發送一個請求,並告知當前負載的值。LIC選一台具有最短運行隊列長度的計算機,並且通知任務所在的計算機把任務發送給它,同時,它把目的主機負載值增加1。 閥值策略。隨機選擇一台計算機,判斷若把任務傳送到那台計算機後,那台計算機的任務隊列長度是否會超過閥值。如果不超過閥值,就傳送此任務;否則,隨機選擇另一台計算機,並以同樣方式判斷,繼續這樣做直到找到一台合適的目的計算機,或探測次數超過一個靜態值限制LP,當任務真正到達計算機以後,不管狀態如何,必須處理該任務。 最短任務隊列策略。隨機選擇LP台不同的計算機,察看每台計算機的任務隊列長度,任務被傳送到具有最短任務隊列長度的計算機。當任務真正到達計算機,無論狀態如何,目的計算機必須處理該任務。對此策略的一個簡單改進時,無論何時,遇到一台隊列長度為0的計算機時,不再繼續探測,因為可以確定此計算機是一台可以接受的目的計算機。 保留策略。當一個任務從一台計算機離開時,該計算機檢查本地負載,如果負載小於閥值T1,就探測其它計算機,並在R個負載大於T1的計算機中登記該計算機的名字,並把登記的內容保留到一個棧中。當一個任務到達一台超載的計算機時,就把這個任務傳送到此台計算機棧頂的計算機上。如果一個計算機的負載低於T1,就清空棧裡保留的所有計算機名。




Zhou的論文中,比較了(2)和(3)三種策略,結論是:以簡單(計算不昂貴)的方式,利用少量狀態信息,第(2)中方法往往獲得比第(3)種方法更好的效果。第(3)中方法比較復雜,它必須用性能的改善來補償額外花費,所以取得的效果會稍差一些[2]。

算法實現目前,常見的算法有:中心任務調度策略、梯度模型策略、發送者啟動策略和接收者啟動策略。

中心任務調度策略

顧名思義,中心任務調度策略就是讓一個特定的處理節點擔任計算任務分配器的角色,我們稱之為調度節點,而把其它完成計算任務的處理節點稱作計算節點。調度節點為了掌握任務分布情況,需要維護一個任務分布表。

在任務啟動時,調度節點裝入任務的預分布情況表,而計算節點則開始完成分配給它的計算任務。在執行過程中,計算節點按照一定的周期向調度節點提交計算任務完成情況,由調度節點根據這些信息判斷處理節點的處理能力,發出任務遷移指令,控制任務從重負載節點向輕負載節點流動,同時還要隨之更新在調度節點上的任務分布表。

中心任務調度的優點顯而易見:調度節點掌握所有節點的處理能力和任務的分布情況,因此它可以在綜合各種因素的基礎上找到最佳的任務遷移方式。但是在計算節點很多時,所有計算機點都必然與中心節點通訊,必然導致嚴重的沖突,這會大大降低動態負載平衡的效率,甚至抵消動態負載平衡所帶來的一切好處。

另外,還應該注意到,調度節點在判斷是否進行任務遷移時,計算節點必須等待,這無疑又浪費了計算節點的處理能力。一種改進的方法是調度節點在收到計算節點的當前任務完成情況時,立即存儲之,並把根據上次的信息做出的判斷返回給計算節點以減少延遲,在空閒時再根據本次收到的信息做出判斷,留到下次使用。這樣就把調度節點進行任務遷移決策的時間和計算節點完成計算任務的時間重疊了起來,降低了動態負載平衡的開銷。

梯度模型策略

在中心任務調度策略中,計算節點越多,沖突就越多。為了減少沖突,適應大量處理節點的需要。梯度模型策略、發送者啟動策略和接收者啟動策略都不設置專用的調度節點,而且每個節點只與一部分節點進行交互,以減少由負載平衡導致的沖突。

在梯度模型策略中,所有處理節點僅與直接相鄰的節點進行交互,並引入兩個閥值:M 1 和Mh。在運行過程中,我們將所在節點劃分成三類:設一個節點的剩余任務量為t,如果t < M 1則稱之為輕負載節點;如果M 1< t < M h則稱之為中負載節點;如果t > M h則稱之為重負載節點。另外,把從一個節點到與之最接近的輕負載節點的最短距離定義為這個節點的梯度。

在啟動時,每個節點都是重負載節點,梯度都是無窮大。在計算過程中,周期性地檢查其剩余負載是否大於M1。當某一節點發現自身剩余的負載小於M1時就把它的梯度設為零,隨後把自身當前的梯度與相鄰節點間的距離之和發送給相鄰的節點。相鄰的節點接收到這個新梯度,就與自身當前梯度進行比較。如果自身梯度小於等於新梯度,則不做任何事;如果自身梯度大於新梯度,則將自身梯度設置為新梯度,並向發送給它新梯度信息的節點一樣傳播新梯度。這樣,梯度信息(實際上就是計算任務完成的情況)就會被傳播開來,重負載節點就可以把它多余的負載發送給向臨界點中梯度最小的節點。於是,計算任務就在梯度的引導之下從重負載節點流向輕負載節點。

可是,按照這種方式,有可能導致過多的計算任務湧向一個輕負載節點。如果輕負載節點接收了過多的新任務,就有可能重新變成中負載甚至重負載節點。一旦出現這種情況,梯度信息就不再能夠正確地引導計算任務了。為此,必須使輕負載節點察看要接受的計算任務,如果接收計算任務使本節點脫離輕節點狀態,就拒絕接受它。這雖然延遲了任務的接收,但隨著時間的推移,輕負載節點實際上不久就可以接受被它拒絕接受的任務了,同時還可以保持節點的梯度的有效性。

發送者啟動策略

發送者啟動策略也引入了一個閥值M來把所有的處理節點劃分成輕負載節點和重負載節點,所有當前剩余負載t > M的節點都被稱為重負載節點,t < M的節點被稱為輕負載節點。發送者啟動策略還需要為每個節點定義一個相關域,節點只與它的相關域中的節點進行交互和任務傳遞。一個直觀的相關域的定義是把所有與之相鄰的節點作為相關域。

在啟動時,所有節點開始執行計算任務。在執行一段時間之後,節點就開始檢查其自身是否是重負載節點。如果是重負載節點,則它就試圖在相關域中均勻地分布任務。具體地:設該重負載節點的負載為l p,相關域中有K個節點,其負載分別為l 1,……., l k,則平均負載L avg為:

為了達到均勻分布,應求得重負載節點應該傳遞給每個相關域中節點的負載量m k。我們首先引入h k以避免負載被遷移到相關域中負載最重的重負載節點。如果L avg> l k,則 ,否則h k= 0。那麼m k為

隨後該節點就可以按照m k向各個相關節點發送任務了。

接收者啟動策略

接收者啟動策略與發送者啟動策略除了是由輕負載節點啟動,要求其它節點把任務發送給它之外,其它基本相同。

接收者啟動策略同樣引入M以區分輕、重負載節點,引入相關域以確定交互范圍。

在啟動時,所有節點開始執行計算任務,經過一段時間之後,一旦某個節點發現自身成為輕負載節點,就試圖在它的相關域中均勻地分布負載。具體地:設該輕負載節點的負載為l p ,相關域中有K個節點,其負載分別為l 1 ,……., l k,則平均負載L avg為:



為了達到均勻分布,應求得相關域中節點應該傳遞給輕負載節點的負載量m k。我們首先引入權h k以避免負載從負載更輕的相關域中的節點被遷移到該節點。如果L avg< l k, 則 ,否則h k=0。那麼m k為:

隨後該節點就可以按照m k發出接受任務的請求了。



隨後該節點就可以按照m k發出接受任務的請求了。



Copyright © Linux教程網 All Rights Reserved