关于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呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值