APP下载

一种基于Nginx的负载均衡算法实现

2017-10-12马卫东

电子设计工程 2017年19期
关键词:进程服务器测试

陈 沛,马卫东

(1.武汉邮电科学研究院 湖北 武汉 430074;2.光迅科技股份有限公司 湖北 武汉 430205)

一种基于Nginx的负载均衡算法实现

陈 沛1,马卫东2

(1.武汉邮电科学研究院 湖北 武汉 430074;2.光迅科技股份有限公司 湖北 武汉 430205)

为了满足日益增长的网站访问量对服务器的需求,提出了一种基于Nginx的负载均衡算法,并完成算法的软件实现。该算法能在高并发的情况下选择合适的后台服务器,充分利用硬件资源,减少系统阻塞或延时。测试结果表明,相比Nginx自带的负载均衡算法,该算法处理连接的速率更高,稳定性更好,达到了设计要求。

Nginx;负载均衡算法;Linux;性能提升

Abstract:In order to satisfy the increasing access number to the Web server,a load balancing algorithm based on Nginx is designed in this paper.The algorithm can choose the appropriate server in high concurrency situation,make full use of the hardware resources and reduce the system blocking or delay.The experimentshow that the algorithm is able to deal with connections faster with smaller error ratiocompared to the Nginx load balancing algorithm,and achieve the design requirement.

Key words:Nginx;load balance algorithm;Linux;performance improvement

随着互联网的快速发展,网络用户和网络资源访问都呈爆发式增长,越来越多的网络服务器工作在高并发访问环境下,由此带来处理器的高负荷工作和繁忙的IO处理[1],单纯的升级服务器硬件只能在一定程度上缓解此问题。而负载均衡机制能够在现有硬件资源之上,将任务分摊到多个后台服务器上共同进行工作,它提供了一种廉价有效透明的方法扩展服务器的并发访问能力,避免系统阻塞[2]。其中,负载均衡算法的实现直接影响着服务器的性能表现,可见,对服务器负载均衡算法的研究变得尤为重要。为了实现对服务器的准确选择,提出并设计了一种基于Nginx的负载均衡模块。该系统能够完成对其准确测试。

1 Nginx简介

Nginx是一款轻量级的Web服务器、反向代理服务器及电子邮件服务器。著名的Apache服务器会对每个请求都会使用一个进程处理请求,当用户请求量多的时候,处理进程也会大量增加,对系统的资源消耗较多,这样就导致了对服务器的高内存和CPU占用,这也就是为什么我们称Apache为重量级服务器[3]。相对的,由于Http请求的大部分时间都在等待响应,Nginx的原理则是当连接状态改变的时候,服务器的事件分发器将被唤醒处理连接的变化,其他时间去处理别的请求,所以服务器只需要一个进程就能够处理大量的连接请求[3]。

如图1所示,Nginx默认是以多进程的方式来工作的。启动后会开启一个master进程和多个worker进程,master进程主要用来管理worker进程,接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,worker进程才开始真正处理请求,各个worker进程之间是相互独立对等的。一个请求只可能在一个worker进程中处理[4]。

Nginx采用了异步非阻塞的方式来处理请求,在Linux中使用Epoll系统调用来同时监控多个事件,如果有事件准备好了就返回,worker进程开始处理请求。当事件没有准备好时,放到Epoll里面等待唤醒,这样就可以处理大量的并发了。与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,更多的并发数,只是会增加一点内存而已。

图1 Nginx架构图

另外,Nginx具有很好的可扩展性,它提供了一个接口供第三方模块的开发,因此可以比较方便的基于Nginx实现本文的负载均衡算法。具体方法如下:

1)定义commands数组并添加到ngx_module_t结构体中;

2)编写解析模块配置的方法ngx_http_mytest;

3)定义ngx_module_t结构体中的 ctx接口供Http框架初始化;

4)编写处理请求并返回响应的函数ngx_http_mytest_handler,在函数内实现算法;

完成上面四步之后,一个模块就被添加到Nginx中,只需要编译运行就可以实现模块的功能[4]。

2 负载均衡简介

服务器的负载均衡表示的是多台服务器以对称的方式组成一个服务器,每台服务器的地位都相同,都可以独立对外提供服务。每当有新的请求来到的时候,负载均衡算法通过计算,选择出对称结构中最适合处理这个请求的一台服务器,将请求分配到这台服务器上,而接受到请求的服务器将独立的回应用户的请求。负载均衡在Nginx中的表现则是通过算法选择合适的worker进程来处理请求[5]。

负载均衡的实现方式分为软件负载均衡、硬件负载均衡、局部负载均衡、全局负载均衡、静态负载均衡、动态负载均衡等[6],Nginx支持的几种负载均衡策略包括:

1)轮询法:每个请求按时间顺序循环分配到不同的后端服务器,这个是Nginx默认的算法。

2)权重法:根据不同权重来选择服务器,服务器的权重可以手动静态设置,也可以动态更新,最终服务器处理请求数目的比例正比于权重,这种方式用于后端服务器性能不均的情况。

3)ip_hash法:每个请求按访问IP的hash结果分配,这种情况下每个用户有固定的后端服务器,可以解决session问题。

4)url_hash法:按访问请求的网址的hash结果来分配请求,不同的url指向不同的服务器,当后端服务器开启缓存时,这种算法比较有效[7]。

总之,设计负载均衡策略需要考虑以下几点:

1)设计算法时应保证尽量简单,也许有些算法能更好的分配,但是却过于复杂,实现这些算法会导致引入额外的资源消耗,反而引起系统阻塞[8];

2)系统在进行决策时,不仅要考虑当前全局的负载状态,还要考虑一段时间内的负载特性进行决策。由于用户请求的动态变化,服务器系统各处理节点上的负载也在不断变化,所以就要求系统能够根据某种动态均衡策略进行服务节点负载的均衡,为用户提供服务[9];

3)没有最好的算法,也没有通用的算法,只有最合适的算法。不同的时间,不同的地区,不同的系统,情况都是不一样的。应该综合考虑这些因素,以适应于不同变化的要求。

3 自定义模块设计

文中设计了一种新的负载均衡算法,它是一种综合服务器负载能力与请求时间的动态算法。首先用户可以自定义负载均衡级别WM_LEVEL,等级越高,计算选择的节点就越精确,但是实现选择的时间越长。

首先算法会查找有没有空闲服务器,如果有的话,则把请求发到服务器上;如果没有剩余的空闲服务器的时候,算法会综合考虑服务器的当前负载能力、总负载能力、和上次请求的间隔、一段时间内服务器请求失败的次数等等因素进行选择。算法的实现函数为ngx_http_upstream_init_fair,其中nreq是服务器当前承载的请求,delta是距离上一次请求的间隔,评分宏与当前承载请求数、请求失败次数成负相关,与上一次请求间隔、服务器总负载能力成正相关。因此当前承载请求越少越优,相同请求数下,上一次间隔越大分数越优。

其次,算法还具有自动调优功能,在函数ngx_http_upstream_fair_try_peer中实现,当fail次数过多的时候,函数会更新参数,选择更合适的服务器;当所有节点的fail次数都增加的时候,会更新算法中参数的系数,使满足动态选优的要求,当然用户也可以手动调用优化。另外,服务器的参数被保存在红黑树中,这样就可以保证加载参数实现算法的速度[10]。算法流程图如图2所示。

图2 算法流程图

4 测试分析

为了保证足够多的连接数模拟高并发访问情况,需要把内存配置的足够大而CPU资源有限[11]。本次测试的硬件平台选择的是。

系统版本:CentOS release 7 x86 64位

Nginx版本:1.9.10

处理器:4核8线程

内存容量:16 G

硬盘容量:100 G

网络连接:本地连接

在进行测试之前,首先进行Linux系统与Nginx的参数优化[12],如下所示:

worker_processes auto #自动把Nginx进程与处理器绑定

worker_connections 65535 #每个进程允许的最多连接数

net.ipv4.ip_local_port_range=1024 65000 #允许系统打开的端口范围。

max_user_processes 65535#系统支持打开的最大文件数

采用Webbench模拟并发连接测试,Webbench是有名的网站压力测试工具,可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。Webbench不但能具有便准静态页面的测试能力,还能对动态页面进行测试[13]。

在Linux下安装好Webbench工具后,启动Nginx,只需输入

就可以开始测试,命令中的1000模拟的并发连接数,30表示测试的持续时间,后面跟着要访问的网页,等待30 s之后就会返回测试每秒钟相应请求数和每秒钟传输数据量。

图3 Webbench性能测试

在Nginx默认的负载均衡策略下,逐渐增加模拟的并发连接数,观察对应的请求响应速率与连接成功数[14],观察规律,得到结果如表1;然后,添加自定义的负载均衡模块,make install编译安装之后,再保持同样的并发连接数进行测试,得到结果如表2所示。

对比两组数据,并绘出趋势图。可以发现当并发连接数逐渐增加时,系统开始阻塞,处理连接速率降低,请求失败数增加。但是在相同的并发连接数目下,自定义算法的连接速率大于默认算法,而且随着并发连接数的增加,错误页面比例的增加速率也远小于默认算法。

表1 默认负载均衡算法测试结果

表2 自定义负载均衡算法测试结果

在60 000并发连接时,自定义负载均衡算法的响应速率是默认的3倍,而请求失败数只有一半;当连接数上升至70 000时,默认的算法已经阻塞,自定义算法依然能正常工作。

可以得出在相同的硬件上,自定义负载均衡算法能够容纳更多的并发连接数,而且保持更好的响应速度。

图4 连接速率对比

5 结 论

文中基于轻量级服务器Nginx设计了一种新的动态负载均衡算法,本算法会优先选择空闲进程,在没有空闲进程的情况下会综合考虑服务器节点的剩余节点处理能力、各个后台服务器的当前实际负载、进程在某个时间段之间的平均负载,择优选择后台进程,避免系统阻塞,保证高并发能力[15]。测试表明本算法能有效的为请求选择合适的服务器,达到负载均衡的效果,相比默认算法能在相同的硬件条件下支持更多的并发连接数,达到了设计要求。

图5 失败请求数对比

[1]杨小娇.轻量级高并发Web服务器的研究与实现[D].南京:南京邮电大学,2014.

[2]祝瑞,车敏.基于HTTP协议的服务器程序分析[J].现代电子技术,2012(4):117-119,122.

[3]凌质亿,刘哲星,曹蕾.高并发环境下Apache与Nginx的I/O性能比较 [J].计算机系统应用,2013(6):204-208.

[4]陶辉.深入理解Nginx:模块开发与架构解析[M].北京:机械工业出版社,2013.

[5]蒋文旭.基于Nginx部署环境的Web加速方案设计与实现[D].北京:北京邮电大学,2013.

[6]郭平,李琪.基于服务器负载状况分类的负载均衡调度算法[J].华中科技大学学报:自然科学版,2012(S1):62-65.

[7]Bragard Q,Ventreaque A.Global dynamic loadbalancing for decentralised distributed simu-lation[C]. Proceedings of the Winter Simulation Conference,2014:3797-3808.

[8]王红斌.Web服务器集群系统的自适应负载均衡调度策略研究[D].长春:吉林大学,2013.

[9]王利萍.基于Nginx服务器集群负载均衡技术的研究与改进[D].济南:山东大学,2015.

[10]王永辉.基于Nginx高性能Web服务器性能优化与负载均衡的改进与实现[D].成都:电子科技大学,2015.

[11]梁明刚,陈西曲.Linux下基于epoll+线程池高并发服务器实现研究 [J].武汉工业学院学报,2012(3):54-59.

[12]李杰.一种高性能服务器的设计与性能评估[J].软件,2014(12):88-93.

[13]乔平安,颜景善,周敏.基于Linux系统的构建高性能服务器的研究 [J].计算机与数字工程,2016(4):653-657.

[14]黄静,李炳.基于Nginx的Web服务器性能优化研究[J].浙江理工大学学报:自然科学版,2016(4):600-606.

[15]李逍遥.基于LAMP的Web服务器性能优化问题研究与实现[D].北京:北京邮电大学,2015.

Design of a load balancing algorithm based on Nginx

CHEN Pei1,MA Wei-dong2
(1.Wuhan Research Institute of Posts&Telecommunications,Wuhan430074,China;2.Accelink Technologies Co., Ltd., Wuhan430205,China)

TN912

A

1674-6236(2017)19-0019-04

2016-07-25稿件编号201607173

陈 沛(1994—),男,江西吉安人,硕士研究生。研究方向:通信与信息系统、互联网技术。

猜你喜欢

进程服务器测试
幽默大测试
债券市场对外开放的进程与展望
通信控制服务器(CCS)维护终端的设计与实现
改革开放进程中的国际收支统计
“摄问”测试
“摄问”测试
“摄问”测试
中国服务器市场份额出炉
得形忘意的服务器标准
计算机网络安全服务器入侵与防御