wrr演算法原理和python實現

2021-10-23 11:14:55 字數 2400 閱讀 6146

令牌輪詢

平滑最大權重

平滑最大權重演算法

平滑最大權重示例

演算法比較

在測試各種負載均衡時,總會看到wrr演算法,為每個後端rs(real server)設定乙個權重值,根據權重值比例來向rs**。

比如如下負載均衡,後端rs1,rs2,rs3權重值分別為40,30,20, 客戶端過來的請求,負載均衡按照2:3:4進行**

初始時分別給rs相應比例的權重

選擇權重最大的rs,如果最大權重有多個,可以選擇第乙個,或者隨機乙個選中的權重減一

反覆重複步驟2,直到所有權重都為0,然後恢復初始權重

北京車牌號搖號序號生成採用的這種演算法,根據每個人的倍數生成序號池

初始時分別給rs相應比例的token

按照token大小排序(有的實現這一步跳過)

逐個選擇,如果token為0則跳過

如果全部都為0,則重新用原始比例填充

第一次,選中rs1

這個演算法是本次介紹的重點,也是nginx在wrr中使用的演算法

初始時分別給rs相應比例的權重

選擇權重最大的rs,如果最大權重有多個,可以選擇第乙個,或者隨機乙個計算未選中的權重和

選中的權重減去上一步的權重和

未選中的加上自身權重

重複步驟2

三個權重分別為2,3,4,

第一次,選中權重最大rs3,未選中部分權重和為2+3=5,更新選中rs3: 4-5=-1更新未選中 rs1: 2+2=4,rs2: 3+3=6

第二次,選中權重最大rs2,未選中部分權重和為2+4=6,更新選中rs2: 6-6=0更新未選中 rs1: 4+2=6,rs3: -1+4=3

import copy

import collections

weights =[4

,3,2

]reqs =

sum(weights)

ws = copy.deepcopy(weights)

print

("init weights:"

, ws)

summary = collections.defaultdict(

int)

forround

inrange(9

):choose = ws.index(

max(ws)

) mv =

sum(

[v for i,v in

enumerate

(weights)

if i != choose ]

) ws =

[v+weights[i]

if i != choose else v-mv for i,v in

enumerate

(ws)

]print

(f'round , choose: '

, ws)

summary[weights[choose]]+=

1print

(dict

(summary.items())

)

執行,輸入如下:

init weights: [4, 3, 2]

round 1, choose: 1 [-1, 6, 4]

round 2, choose: 2 [3, 0, 6]

round 3, choose: 3 [7, 3, -1]

round 4, choose: 1 [2, 6, 1]

round 5, choose: 2 [6, 0, 3]

round 6, choose: 1 [1, 3, 5]

round 7, choose: 3 [5, 6, -2]

round 8, choose: 2 [9, 0, 0]

round 9, choose: 1 [4, 3, 2]

演算法4,3,2

5,1,1

1,1,5

優點缺點

最大權重

1,1,2,1,2,3,1,2,3

3,3,3,3,3,1,2

3,3,3,3,1,2,3

演算法簡單

如果某乙個權重比較大,則開始幾個都會落在這個rs上

令牌輪訓

1,2,3,1,2,3,1,2,1

1,2,3,1,1,1,1

3,1,2,3,3,3,3

演算法簡單

如果某乙個權重比較大,則最後幾個都會落在這個rs上

平滑最大權重

1,2,3,1,2,1,3,2,1

1,1,2,1,3,1,1

3,3,1,3,2,3,3

計算複雜,需要遍歷兩次

權重較小的能更平均的落在訪問中

gcForest演算法原理及Python實現

1.背景介紹 從目前來看深度學習大多建立在多層的神經網路基礎上,也即一些引數化的多層可微的非線性模組,這樣就可以通過後向傳播去訓練,zhi hua zhou和ji feng在deep forest 中基於不可微的模組建立深度模組,這就是gcforest。傳統的深度學習有一定的弊端 超引數個數較多,訓...

K means和ISODATA 演算法 原理與實現

k means演算法 原理 對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為k個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。如果用資料表示式表示,假設簇劃分為 c1,c2,ck 則我們的目標是最小化平方誤差e 其中 i是簇ci的均值向量,有時也稱為質心,表示式為 一般步驟 1....

Perona Malik 演算法Python實現

最近正好在學習關於影象處理的東西,需要用到pm perona malik 演算法,所以就把自己的一些理解和 貼上來,希望能跟大家一起 pm演算法的具體原理可以網上查閱相關資料或者相關書籍,這裡只是簡要介紹大概的實現思路 一般而言,對乙個影象進行提取特徵之前,需要進行降噪濾波處理。最常用的應該是高斯濾...