最少鏈接數調度算法(Least Connection Scheduling)
在實際狀況中,客戶端的每一次請求服務在服務器停留的時間可能會有較大的差別,隨着工做時間的延伸,若是採用簡單的輪詢或隨機均衡算法,每一臺服務器上的鏈接
進程數目可能會產生極大的不一樣,這樣實際上並無達到真正的負載均衡。
最少鏈接數均衡算法對內部中需負載的每一臺服務器都有一個數據記錄,記錄當前該服務器正在處理的鏈接數量,當有新的服務鏈接請求時,將把當前請求分配給鏈接數最少的服務器,使均衡更加符合實際狀況,負載更加均衡。
與輪詢調度算法想反,最小鏈接調度是一種動態調度算法,它經過服務器當前所活躍的鏈接數來估計服務器的負載狀況。調度器須要記錄各個服務器已創建鏈接的數目,當一個請求被調度到某臺服務器,其鏈接數加1;當鏈接停止或超時,其鏈接數減一。
此種均衡算法適合長時處理的請求服務,如FTP等應用。
最少鏈接數調度算法流程
假設有一組服務器S = {S0, S1, ..., Sn-1},C(Si)表示服務器Si的當前鏈接數。其算法以下:
for (m = 0; m < n; m++) { for (i = m+1; i < n; i++) { if (C(Si) < C(Sm)) m = i; } return Sm; } return NULL; |
當各個服務器有相同的處理性能時,最小鏈接調度算法能把負載變化大的請求分佈平滑到各個服務器上,全部處理時間比較長的請求不可能被髮送到同一臺服務器上。可是,當各個服務器的處理能力不一樣時,該算法並不理想,由於
TCP鏈接處理請求後會進入T
IME_W
AIT狀態,TCP的TIME_W
AIT通常爲2分鐘,此時鏈接還佔用服務器的資源,因此會出現這樣情形,性能高的服務器已處理所收到的鏈接,鏈接處於TIME_WAIT狀態,而性能低的服務器已經忙於處理所收到的鏈接,還不斷地收到新的鏈接請求。
因此,針對這種算法是須要改進的,也是有改進的餘地的,這就是權重最少鏈接數調度算法。
權重最少鏈接數調度算法(Weighted Least Connection Scheduling)
權重最少鏈接數調度算法是在作少鏈接數調度算法的基礎上,根據服務器的不一樣處理能力,給每一個服務器分配不一樣的權值,使其可以接受相應權值數的服務請求,是在最少鏈接數調度算法的基礎上的改進。
權重最少鏈接數調度算法流程
假設有一組服務器S = {S0, S1, ..., Sn-1},W(Si)表示服務器Si的權值,C(Si)表示服務器Si的當前鏈接數。全部服務器當前鏈接數的總和爲
CSUM = ΣC(Si) (i=0, 1, .. , n-1)。
當前的新鏈接請求會被髮送服務器Sm,當且僅當服務器Sm知足如下條件:
(C(Sm) / CSUM)/ W(Sm) = min { (C(Si) / CSUM) / W(Si)} (i=0, 1, . , n-1)
其中W(Si)不爲零
由於CSUM在這一輪查找中是個常數,因此判斷條件能夠簡化爲
C(Sm) / W(Sm) = min { C(Si) / W(Si)} (i=0, 1, . , n-1)
其中W(Si)不爲零
由於除法所需的
CPU週期比乘法多,且在某些
操做系統(如
Linux)的內核中不容許浮點除法,服務器的權值都大於零,因此判斷條件C(Sm) / W(Sm) > C(Si) / W(Si) 能夠進一步優化爲C(Sm)*W(Si) > C(Si)* W(Sm)。同時保證服務器的權值爲零時,服務器不被調度。因此,算法只要執行如下流程。
for (m = 0; m < n; m++) { if (W(Sm) > 0) { for (i = m+1; i < n; i++) { if (C(Sm)*W(Si) > C(Si)*W(Sm)) m = i; } return Sm; } } return NULL; |
這種算法的邏輯實現如圖1和圖2所示:
圖1顯示在T時刻,一個新請求到來時,負載均衡設備的響應狀況:
圖1 (權重)最少鏈接數調度算法邏輯示意圖
當通過t時間後,新的請求到來是,負載均衡設備的調度狀況變化結果以下:
圖2 (權重)通過t時間後最少鏈接數調度算法邏輯示意圖
總結
權重最少鏈接數調度算法特色是實現起來比較簡潔,在大多數狀況下很是有效,在不少產品,如ArrayNetWorks等公司的產品中均有實現。