dyups模块对nginx性能影响的测试

测试名称:

dyups模块对nginx性能影响

 

测试目的:

 

测试不同场景下dyup模块对nginx性能的影响,并以此为参考制定后续优化方案

 

背景介绍:

 

公司采用dyups+tengine实现后端业务的动态发现,随着业务增长以及新平台上线,我们nginx集群中的upstream总节点成倍增长。在此背景下,我们发现节点数较多的大业务集群滚动升级时,nginx集群的响应时间会急剧增加。

 

在公司大佬源码解读和测试后,我们定位到是大致原因是nginx的 worker会定期检查共享内存从队列里读取dyups更新指令,而由于有锁的存在,同一时间只能有一个worker进行dyups更新操作。当dyups变更的集群节点数较多时,dyups更新的时间会比较长,而worker准备执行dyups更新但上一个worker

未完成dyups更新操作时,此worker阻塞住,不会继续处理业务请求。若平台不停调用dyups变更upstream节点,随着时间的推移,阻塞的worker会越来越多,会急剧降低nginx的性能。

 

下面我画一个理想情况下的简单模型介绍一下几种场景

假设worker检查共享内存的时间点是均匀分布的

T1 T2 ... Tn 为worker1 worker2 ... workern 检查共享内存的时间点。一共有n个worker

t1  t2 ... tn 为worker1 worker2 ... workern 更新完dyups的时间点

 

场景1 dyups更新时间小于worker之间检查共享内存时间间隔

此时每个worker更新完dyups时下一个worker还未检查共享内存,此时nginx的响应时间会稍涨,但总体影响较小

 

场景2 dyups更新时间大于worker之间检查共享内存时间间隔

当t1时,worker1 执行完dyups变更,而worker2和worker3会被阻塞住。当t3时,worker4-worker7会被阻塞住。我们可以发现,随着时间推移,阻塞的worker会越来越多

当dyups更新时间 大于 worker检查共享内存时间间隔(dyups_read_msg_timeout )/ worker数量 时,会必然出现worker阻塞的情况

 

场景3 所有worker被阻塞

tm时,workerm的下一次检查共享内存的轮训间隔已经到了,但workerm 的dyups更新还未完成,此时所有worker 都已经被阻塞住,nginx已经完全无法处理业务请求

 

要注意的是场景2之后由于会存在worker被阻塞的情况,此时nginx性能会处于非常不稳定的状态,线上一定要避免达到此场景

 

测试环境

 

服务器: M02 20×2cores 256GB mem 两台,一台作为nginx服务器,另一台作为后端和客户端服务器

系统版本: CentOS 7.3

nginx版本: Tengine/2.3.2(nginx/1.17.3)

背景流量: 10000 qps 由wrk作为客户端

后端服务: flask * 40 实例,业务平均处理时长 0.1s

 

测试项目

 

1. 变更的集群数量对nginx性能的影响

 

2. upstream总节点数对(1)的影响

 

3. dyups变更持续时间对nginx性能的影响

 

4. dyups变更间隔对nginx性能的影响

 

5. 开启和关闭check模块对dyups模块和nginx性能的影响

 

6. worker 数量对dyups性能的影响

 

测试结果

 

注意:此结果的数据(集群节点数,变更节点数等)只具备参考价值,不具备指导制定线上具体指标的作用

 

1. 变更的集群数量对nginx响应延迟的影响

 

nginx总节点数为10000,变更间隔为1s,dyups变更的集群节点数为300、350、400、450和500时对 nginx性能的影响

 

 

 

2. upstream总节点数对测试1的影响

 

upstream总节点数为10000、9000、8000、7000和6000,变更间隔为1s时,dyups变更的集群节点数对 nginx性能的影响

 

 

3. dyups变更时间对nginx性能的影响

upstream总节点数为10000,变更间隔为1s,变更集群节点数为350时。变更持续时间对nginx性能的影响

4. dyups变更间隔对nginx性能的影响

upstream总节点数为10000,变更集群节点数为350,变更间隔为2s、1.5s、1s、0.5s时,nginx性能的影响

5. 开启和关闭check模块对dyups模块和nginx性能的影响

 

upstream总节点数为10000,变更间隔为1s,只关闭变更集群的主动健康检查,dyups变更的集群节点数对 nginx性能的影响

upstream总节点数为10000,变更间隔为1s,关闭所有upstream主动健康检查,dyups变更的集群节点数对 nginx性能的影响

 

6. worker 数量对dyups性能的影响

 

 

附加测试

在上述测试之外又做了一些关于参数的测试,但未记录数据,下面只说结论

 

dyups_read_msg_timeout 这个指令设置了worker从共享内存中读取指令的时间间隔。

    调整此参数可以有效提高dyups的性能。但由于会影响dyups的时效性,所以调整需要慎重

dyups_trylock off 打开此参数将获得更好的性能,但它可能不稳定,并且当更新请求与其他请求冲突时,您将获得“ 409”。

打开此参数时,当dyups未更新完时,nginx会拒绝新的修改dyups请求,并返回409状态码。这个实际上相当于强制提高了变更dyups间隔,由此避免worker阻塞恶化的场景出现

 

 

优化建议

 

根据上面实验结果,有以下优化方向

1. 减少单台nginx 总upstream节点数

2. 限制客户端调用dyups频率 ,尽量减少修改dyups总时间

3. 调大 dyups_read_msg_timeout (此参数会降低dyups时效性),打开dyups_trylock

4. 弃用check模块,使用其他主动健康检查方式

 

 

 

 

 

 

 

 

 

 

 

 

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值