Nginx(15)_性能优化
对Nginx进行硬件集群负载均衡
一、提高硬件质量
- 更换高性能CPU
- 关键应用程序数据使用固态硬盘
- 更换速率更高的网卡,例如万兆网卡
- 更换更大更快的内存
二、使用LVS做集群负载均衡
LVS是Linux Virtual Server的简写,Linux虚拟服务器,是一个虚拟的服务器集群系统。
三、使用DNS做集群负载均衡
DNS可以将用户请求分配到不同IP的nginx服务器。
提高CPU使用率
- 尽可能占用全部的CPU资源
- 尽可能占用更大的CPU时间片、减少进程间切换
1、配置nginx子进程
work_processes auto;
2、将worker子进程与CPU绑定
worker_cpu_affinity 01 10 01 10;
3、提高worker子进程的进程优先级
worker_priority -20;
4、延迟处理新连接
listen 8080 deferred;
修改TCP内核参数
1、net.ipv4.tcp_syn_retries = 6
表示应用程序进行connect()系统调用时,在对方不返回SYN + ACK的情况下(也就是超时的情况下),第一次发送之后,内核最多重试几次发送SYN包;并且决定了等待时间.。Linux上的默认值是 net.ipv4.tcp_syn_retries = 6 ,也就是说如果是本机主动发起连接,(即主动开启TCP三次握手中的第一个SYN包),如果一直收不到对方返回SYN + ACK ,那么应用程序最大的超时时间就是127秒。
2 分 7 秒即 127 秒,刚好是 2 的 7 次方减一,聪明的读者可能已经看出来了,如果 TCP 握手的 SYN 包超时重试按照 2 的幂来 backoff, 那么:
第 1 次发送 SYN 报文后等待 1s(2 的 0 次幂),如果超时,则重试
第 2 次发送后等待 2s(2 的 1 次幂),如果超时,则重试
第 3 次发送后等待 4s(2 的 2 次幂),如果超时,则重试
第 4 次发送后等待 8s(2 的 3 次幂),如果超时,则重试
第 5 次发送后等待 16s(2 的 4 次幂),如果超时,则重试
第 6 次发送后等待 32s(2 的 5 次幂),如果超时,则重试
第 7 次发送后等待 64s(2 的 6 次幂),如果超时,则超时失败
上面的结果刚好是 127 秒。也就是说 Linux 内核在尝试建立 TCP 连接时,最多会尝试 7 次。
应用程序最大的超时时间不能超过内核的设定,可以小于等于内核的设定.。
摘自:https://www.dazhuanlan.com/2019/10/20/5dab43fbaadb1/
2、net.ipv4.tcp_synack_retries = 5
显示或设定 Linux 核心在回应 SYN 要求时会尝试多少次重新发送初始 SYN,ACK 封包后才决定放弃。这是所谓的三段交握 (threeway handshake) 的第二个步骤。即是说系统会尝试多少次去建立由远端启始的 TCP 连线。tcp_synack_retries 的值必须为正整数,并不能超过 255。因为每一次重新发送封包都会耗费约 30 至 40 秒去等待才决定尝试下一次重新发送或决定放弃。tcp_synack_retries 的缺省值为 5,即每一个连线要在约 180 秒 (3 分钟) 后才确定逾时。
摘自:http://blog.chinaunix.net/uid-24585858-id-4856556.html
3、net.ipv4.tcp_syncookies = 0
YN Cookie是对TCP服务器端的三次握手做一些修改,专门用来防范SYN Flood×××的一种手段。它的原理是,在TCP服务器
接收到TCP SYN包并返回TCP SYN + ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。这个
cookie作为将要返回的SYN ACK包的初始***。当客户端返回一个ACK包时,根据包头信息计算cookie,与返回的确认序列
号(初始*** + 1)进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。
原理:在Tcp服务器收到Tcp Syn包并返回Tcp Syn+ack包时,不专门分配一个数据区,而是根据这个Syn包计算出一个cookie值。在收到Tcp ack包时,Tcp服务器在根据那个cookie值检查这个Tcp ack包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。
默认为0,1表示开启,能够防止syn flood攻击。
摘自:https://blog.csdn.net/weixin_42104231/article/details/83655742
4、net.ipv4.tcp_max_syn_backlog =1000
tcp_max_syn_backlog是指定所能接受SYN同步包的最大客户端数量,即半连接上限;
somaxconn是指服务端所能accept即处理数据的最大客户端数量,即完成连接上限。
区别:
- tcp_max_syn_backlog用于指定酒席现场面积允许容纳多少人进来;
- somaxconn用于指定有多少个座位。
- 显然tcp_max_syn_backlog>=somaxconn。
摘自:https://blog.csdn.net/chuixue24/article/details/80486866
- 查看net.core.netdev_max_backlog
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
- 查看net.ipv4.tcp_max_syn_backlog
cat /proc/sys/net/core/netdev_max_backlog
- 查看net.core.somaxconn
cat /proc/sys/net/core/somaxconn
或sysctl -a | grep somaxconn
修改配置:
<1>vi /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 248000
net.core.somaxconn = 50000
net.core.netdev_max_backlog = 248000
<2> 重启配置sysctl -p
配置nginx.conflisten 8080 deferred backlog=248000;
开启TCP FAST OPEN
1、原理
- 客户端第一次发送SYN进行握手请求,服务端返回给客户端SYN+ACK+Cookie值
- 客户端发起请求带上ACK+DATA值
- 当客户端断开连接再次发起连接的时候,直接发送SYN+Cookie+DATA
- 服务端收到Cookie进行校验,校验完成再发送响应报文,从而省略了初次接收SYN和发送ACK的过程,提高了请求效率。
2、配置
-
查看net.ipv4.tcp_fastopen
sysctl -a | grep net.ipv4.tcp_fastopen
0:表示关闭fast open功能
1:表示作为客户端到上游服务器,开启fast open功能
2:表示作为服务器端,客户端发来请求开启fast open功能
3:表示作为客户端和服务端都打开fast open功能 -
修改配置:
vi /etc/sysctl.conf
net.ipv4.tcp_fastopen = 3
-
重启配置查看
sysctl -p