e世博国际

首页 > 正文

QPS 提升60%,揭秘阿里巴巴轻量级开源 Web 服务器 Tengine 负载均衡算法

www.sastomarkets.com2019-07-20
E世博下载

在Ali的第7层流量入口网关(应用网关)场景的情况下,Nginx的官方平滑加权循环(SWRR)负载平衡算法不再能够完美地执行其技能。 Tengine不仅通过实施新的负载均衡算法虚拟节点平滑加权循环(VNSWRR)优雅地解决了SWRR算法的缺点,而且与Nginx官方SWRR算法相比,还将QPS处理能力提高了约60%。

访问层Tengine通过自行开发的动态上游模块实现动态服务发现,即运行时动态感知后端应用程序机器的扩展和收缩,权重调整和健康检查。同时,这个功能可以做很多事情。例如,用户可以调整后端某台机器的重量,达到在线实时排水和压力测量的目的。但是,这些操作可能会在Nginx原生SWRR算法下导致不可逆转的流血。

在应用层场景中,Nginx的负载均衡算法SWRR将使机器的QPS实时增加。如上图所示,当App2-host-A机器的重量调整为2时,流量将集中在某个时间。转发到机器;

Nginx的SWRR算法的处理时间复杂度为O(N),并且在大规模后端场景中Nginx的处理能力将呈线性下降;

综上所述,接入层Tengine的负载均衡转发策略的转换和性能优化迫在眉睫。

在介绍案例之前,让我们简要介绍一下Nginx负载均衡算法SWRR转发策略和功能:

SWRR算法的全称是平滑加权循环平衡,顾名思义,它比其他加权循环(WRR)算法具有更多的平滑功能。

下面我们在一个简单的专栏中描述算法:

假设有3台机器A,B和C分别为5,1和1,其中数组s代表机器列表,n代表机器数量,cw每台机器初始化为0,ew初始化为机器重量,tw代表当前轮次。选择所选机器中所有机器的总和,最好表示在该轮中选择的机器。简单的描述是每次选择机器列表中具有最大cw值的机器时,所选机器的cw将减去tw,从而减少下次选择的机会。简单的伪代码描述如下:

请求编号选择前的权重值选择后选择的服务器权重值

0 {5,1,1} A {-2,1,1}

1 {3,2,2} A {-4,2,2}

2 {1,3,3} B {1,-4,3}

3 {6,-3,4} A {-1,-3,4}

4 {4,-2,5} C {4,-2,-2}

5 {9,-1,-1} A {2,-1,-1}

6 {7,0,0} A {0,0,0}

选择SWRR算法的顺序是:{A,A,B,A,C,A,A}

常见WRR算法选择的顺序可以是:{C,B,A,A,A,A,A}

SWRR与常见的WRR算法功能相比:平滑,分散。

从上面的描述来看,SWRR算法似乎是完美的,但在某些情况下仍然存在一些缺陷。让我们看一下真实情况,看看它有哪些缺陷:

一天早上,派出的班级赶到我的车站。那时,看到他的样子特别紧张。我认为这是一个问题。果然:'当我将中央计算机房中机器的重量从1调整到2时,接入层Tengine不会根据这个重量比转发流量?当时,QPS变化的趋势如下:

注意:深蓝色曲线表示重量增加了机器的QPS,浅绿色曲线表示群集的平均QPS。

那时,当我看到这个交通趋势变化图时,我也感到惊讶,但幸运的是,如果地图中有数据,我们可以先分析图中的几个特征数;因为有些数据很敏感,所以不在这里进行详细的数据分析。直接描述其现象和原因:

当时传输到机器的流量基本上是应用室总流量的1/2,并且机器的流量在一段时间后恢复到预期的重量比。原因在于,由于接入层Tengine将后端机器的信息更改为动态感应热,因此Nginx官方SWRR算法策略首次在当前机器列表中选择具有最高权重的机器。结果,已经感知到后端机器重量变化的接入层Tengine将第一请求转发给重量增加的机器。

以下是上游2000后端的配置,反向代理场景中Nginx的功能热点如下所示。 ngx_http_upstream_get_peer函数消耗高达39%的CPU消耗,因为SWRR算法选择的机器的时间复杂度为O(N)(其中N表示后端机器的数量),这相当于执行每个请求。只有2000个周期才能找到与此转发相对应的后端机器。

?压力测量环境

CPU型号:Intel(R)Xeon(R)CPU E5-2682 v4

热门浏览
热门排行榜
热门标签
日期归档