1. 程式人生 > >關於nginx平滑均勻加權輪詢演算法的思考

關於nginx平滑均勻加權輪詢演算法的思考

緣起:http://blog.csdn.net/gqtcgq/article/details/52076997

關於nginx演算法的平滑均勻性的一點分析(只考慮兩個的情況,多個的可以類比)。

假設a出現的權重為M,b出現的權重為N

1均勻性:

把演算法的操作分成兩個,max操作(只有選中的才執行,執行後代價是要被減去total權重(M+N))和add操作(不管怎麼選中都會執行)。

對於a,假設一次迴圈會執行k次(我們要證明k為M)max操作,每次操作減M+N的權重,一共減去k*(M+N)的權重,而無論a還是b總共的執行add次數為M+N,a每次增加的權重的為M,a一共增加的權重也為(M+N)*M,迴圈結束後權重為0,所以可得k等於M,對於b同理。

2平滑性:

假設M=k*N,我們這裡可以把N假設成1,對於N大於1的情況,可以簡化成N為1,(比如a:6和b:2簡化成a:3和b:1)

這裡我們考慮第一次出現N的時間點(既第幾次選擇出現N),由程式碼可知第一次出現N的條件是不可能的(我們假設M>=N的),即使M==N,我們也假設演算法會先選擇M。

有程式碼我們可以有如下的推理:

當1=<k<3時 第1次出現N

當3=<k<5時 第2次出現N

當5=<k<7時 第3次出現N
當7=<k<9時 第4次出現N

進一步分析,我們可知,

當k為偶數時,第一次出現N的位置為k/2+1(k為2時,aba;k為4時aabaa)

當k為奇數時,第一次出現N的位置為(k+1)/2+1(k為3時aaba,k為5時aaabaa)

對於N不等於1的情況,比如a:6 b:2的情況,會出現(aabaaaba,並不是aabaabaa)

原文例子中這個對於不是兩個的情況

a(4) b(2) a(4) c(1) a(4) b(2) a(4)

可以理解為先是a和b(輸出aba),再(ab)和c(輸出abacaba)

不是精確的證明,更不是權威的分析,只是便於理解或者加深記憶,錯誤之處,歡迎指正,若有精確完美的證明,懇請分享。

還有一個問題,一直耿耿於懷,nginx的負載均衡有這樣的程式碼

ngx_accept_disabled = ngx_cycle->connection_n / 8  - ngx_cycle->free_connection_n;

說的是隻有當空閒的連結數大於總連結數的1/8時才會參與獲取accept鎖,既才會參與去競爭鎖資源,不理解的是為什麼這個數是1/8,也知道這個數過大比如1/2那麼可能會造成該程序偷懶的情況,既程序處理的任務很少,資料過小,比如1/16,可能會造成這一次獲取的處理任務數過多,導致該程序處理不過來(因為只有1/16的空閒連結,萬一來的多呢),但是為什麼是1/8呢?