http://kb.linuxvirtualserver.org/wiki/Weighted_Round-Robin_Scheduling
加权轮循调度是为了更好地处理不同处理能力的服务器。每个服务器都可以被分配一个权重,一个表示处理能力的整数值。权值较高的服务器比权值较低的服务器首先接收到新连接,权值较高的服务器比权值较低的服务器获得更多连接,权值相等的服务器获得相同的连接。加权轮循调度的伪代码如下:
Supposing that there is a server set S = {S0, S1, ..., Sn-1};
W(Si) indicates the weight of Si;
i indicates the server selected last time, and i is initialized with -1;
cw is the current weight in scheduling, and cw is initialized with zero;
max(S) is the maximum weight of all the servers in S;
gcd(S) is the greatest common divisor of all server weights in S;
while (true) {
i = (i + 1) mod n;
if (i == 0) {
cw = cw - gcd(S);
if (cw <= 0) {
cw = max(S);
if (cw == 0)
return NULL;
}
}
if (W(Si) >= cw)
return Si;
}
举例:
A B C这3个服务器的权重分别是4 3 2
一开始等于cw=0,最大公约数是1,cw减去最大公约数后是-1,cw被置为服务器中最大的权重4
第一轮cw>=4的只有
A
第二轮cw减去最大公约数后是3,cw>=3的有
A B
第三轮cw减去最大公约数后是2,cw>=2的有
A B C
第四轮cw减去最大公约数后是1,cw>=1的有
A B C
cw减去最大公约数后是0,重新开始,cw被置为服务器中最大的权重4
cw相当于一个标杆,通过不断的降低标杆让权重小的服务器能被调度