影响Nginx性能的因素
发布时间:2018-02-23 浏览:864打印字号:大中小
Nginx的优化不能单纯看Nginx本身,其实有很多方面会影响到Nginx的整体性能。
1、网络层面
带宽
带宽对Nginx性能的影响是最为直接的,就算如何独享10M的带宽也肯定不如100M带宽下Nginx的性能。另外,现在大部分公司的网站都拥有多个二级域名在提供服务,而这多个二级域名通常是共享一个出口带宽的,这样就造成Nginx来提供服务时,资源会受干扰。
网络质量
在中国的互联网中,网络质量跟国外是没法比的,经常出现的情况是客户端到Nginx服务端总是会经过好几个路由,但凡其中任何一个路由节点出现问题,会影响最终Nginx服务端的各种性能问题,例如数据重传、数据超时等。
Nginx直连交换机收敛比
交换机收敛比通常指交换机接服务器的下行流量跟交换机上行链路的比例,一般中型及中小型公司对IDC业务网络没有过多的规划,导致交换机收敛比通常是大于1的,也就意味着数据在交换机中是阻塞型转发,会影响Nginx的数据转发,尤其是作为反向代理时的影响更大。
Nginx架构中网络部署方式
大部分互联网公司通常会采用如下结构的网络:
这种结构对比互联网公司而言,请求需要经过路由器、防火墙、IDS/IPS等好几层的设备最终才能由业务服务器来响应请求,这期间请求没经过一层都需要消耗一定的时间,通过累计这个时间就会被放大,而且防火墙的性能直接决定了Nginx可以承载的请求数。所以迫不得已要用防火墙的话,请使用30万以上的防火墙来做,几万的防火墙性能其实达不到业务需求的。
2、服务器硬件层面
CPU
Nginx的工作模型是master-worker方式,简单来说,越多的worker也就意味着越多的承载力,CPU的核心数从某种程度来说决定了Nginx优质的worker工作数量。
内存
内存的容量直接决定了Nginx可承载的连接数。
硬盘
Nginx的使用过程中,容易产生IO的地方还是挺多的,比如各种临时文件、错误日志、访问日志、缓存等。而硬盘的传输速度可以影响到这些产生的IO,比如硬盘的转速、硬盘的容量、硬盘的输出带宽等。
网卡
这里以戴尔服务器举例,戴尔服务器默认配置的网卡为Broadcom的,这种网卡一般使用没问题,但遇上Nginx在处理大量小包的情况下,默认配置的网卡就会发生严重丢包的事情,内核层面的丢包会造成大量的数据重传从而影响整个Nginx服务器的性能。所以对于Nginx而言需要选择合适的网卡。
3、操作系统层面
/etc/sysctl.conf的配置
很多时候大部分的运维都是从网上复制粘贴sysctl.conf的配置,对于其中一些value的配置都是没有任何依据,所以容易被出现的各种TCP状态而担心。而这些抄来的配置也从根本上影响着Nginx的运行。
系统资源限制
这里的资源限制主要指文件句柄数的限制,文件句柄数的多少限制了Nginx可以支持的连接数,不合理的配置会造成Nginx出现大量的500、502错误
IRQ Balanc
关于IRQ Balance服务,初衷是为了更好地利用CPU的资源来处理事务,但很多场景下,包括Nginx的应用,这个服务并不能起到利好的作用,反而会引起中断的不平衡造成Nginx性能下降。
系统开放多余的端口
严格来说,这种情况发生的几率还是比较低的。一般没有做运维标准化的公司,在服务器安装系统时,默认就会开启很多的服务,比如sendmail、postfix、ntpd、bind等等,这些服务一般监听在所有的IP上,也就意味着Nginx部署在这种环境下,一旦有恶意攻击者攻击非Nginx的端口,就会造成整个服务器资源被耗尽(DDoS的典型症状),从而让Nginx失去服务能力。
4、Nginx层面
编译进业务不需要的模块
有很多运维对于Nginx的安装大部分都是用yum或者apt-get进行安装,这种安装基本上都会把一些不需要的模块编译进去,在Nginx提供高并发时多少还是要消耗一定的内存资源,前面我们说了内存直接决定了Nginx能够承载多少连接的能力。
糟糕的配置
很多人发挥不了Nginx的性能,主要原因就是对Nginx的配置不熟悉,对于Nginx的参数指令不了解,所以各种各样的配置五花八门,这里实在没法一一列举,详情可以参看度娘,一搜一大片。
缓存使用不合理
Nginx的缓存,本意是为了提升Nginx的处理能力,降低上游服务器的压力,而大部分运维也是从网上抄,于是带来的结果就是缓存的不合理配置造成响应延时过高、缓存清理麻烦等问题。
5、上游服务器层面
Nginx在大部分的应用场景要么是通过http协议来反向代理上游服务器,要么是通过fastcgi协议来代理php应用,这两类应用也是会对Nginx自身的性能带来影响的。
PHP应用
当前一般都是使用PHP-FPM来提供fastcgi协议的接入,PHP的版本以及PHP-FPM的配置都会造成Nginx反代php-fpm时,容易发生502、504的错误。
Java应用
一般用于Java应用都逃不过Tomcat、jetty、resin,如果出现容器本身配置不合理、JVM不优化、Java容器选择不合理,将直接影响Nginx做反代时的并发能力。