文章目錄
- 1、ip_vs_scheduler結構
- 2、調度演算法
- 3、動態反饋演算法
調度演算法就是,當新串連到來時,負載平衡器如何選擇真實伺服器的一種演算法。它是負載平衡器的重要組成部分。IPVS中實現的負載平衡演算法主要有輪詢-rr、加權輪詢-wrr、最少串連-lc、加權最少串連-wlc。1、ip_vs_scheduler結構
/* * The scheduler object */ struct ip_vs_scheduler { struct list_head n_list; /* d-linked list head */ char *name; /* scheduler name */ atomic_t refcnt; /* reference counter */ struct module *module; /* THIS_MODULE/NULL */
/* scheduler initializing service */ int (*init_service)(struct ip_vs_service *svc); /* scheduling service finish */ int (*done_service)(struct ip_vs_service *svc); /* scheduler updating service */ int (*update_service)(struct ip_vs_service *svc);
/* selecting a server from the given service */ struct ip_vs_dest* (*schedule)(struct ip_vs_service *svc, const struct sk_buff *skb); };
|
這裡主要看四個函數指標。
init_service函數是與ip_vs_service對象綁定時調用的,利用ip_vs_service對象的一些資料對ip_vs_scheduler對象進行初始化。
done_service函數正好與init_service相反,它是在與ip_vs_service對象解除綁定時調用的,釋放初始化時申請的記憶體等資源。
update_service函數是當ip_vs_service對象更新時調用,例如dest的增加/刪除/修改,都會調用update_service函數。
這三個函數一般都是維護ip_vs_service對象的sched_data屬性,其中包含了每個dest的資訊。各種調度演算法中,維護
sched_data的方式是不同的。如rr演算法中,ip_vs_rr_scheduler將ip_vs_service對象的destinations
鏈表中的某個節點作為其sched_data,以註明當前輪詢到哪台dest了。而甚至在lc演算法中,其sched_data是空的。
schedule函數是最重要的,它根據輸入的資料包(sk_buff結構,包含了資料包的源地址等所有資訊),選擇一台dest,返回一個ip_vs_dest對象。
2、調度演算法2.1、RR
其對應的ip_vs_scheduler對象為ip_vs_rr_scheduler。它的sched_data指向ip_vs_service對象的某個dest,schedule函數僅僅是在dest鏈表找到下一個可用的dest對象。
2.2、WRR
其sched_data為一個結構體:
/* * current destination pointer for weighted round-robin scheduling */ struct ip_vs_wrr_mark { struct list_head *cl; /* current list head */ int cw; /* current weight */ int mw; /* maximum weight */ int di; /* decreasing interval */ };
|
cl為當前的dest節點,cw為當前權重(注意並不是指cl的權重),mw為最大權重,di為所有權重值的最大公約數。
設S1、S2、S3為三個dest節點。為了描述簡單,假設di為1。其輪詢過程中,一輪下來總共經曆了W1+W2+W3次調度,其中S1被調度W1次,S2被調度W2次,S3被調度W3次。假設W1=3,W2=W3=1,
| S1 |
S2 |
S3 |
cw |
cl |
| |
|
|
0 |
HEAD |
| |
|
S3 |
3 |
S3 |
| |
|
S3 |
2 |
S3 |
| S1 |
|
|
1 |
S1 |
| |
S2 |
|
1 |
S2 |
| |
|
S3 |
1 |
S3 |
先將cw設定成MAX(W),然後從dest鏈表中找到權重不小於cw的節點,並依次返回。將cw減1,然後再遍曆dest鏈表,返回權重不小於cw的節點。直到cw為0,一輪調度結束。
2.3、LC和WLC
其sched_data均為NULL。
LC演算法遍曆dest鏈表,找到串連數最少的節點,並返回。串連數的計算公式:dest->activeconns*256 + dest->inactconns。
WLC演算法和LC演算法基本一樣,只是計算公式不同:(dest overhead) / dest->weight
3、動態反饋演算法
這是一種基於真實伺服器載荷查詢的反饋調度演算法,根據真實載荷動態調整權重比例。這需要IPVS和其他監控程式配合使用。