IPVS代碼閱讀筆記(三):調度演算法

來源:互聯網
上載者:User
文章目錄
  • 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和其他監控程式配合使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.