Nginx(15)_性能优化

对Nginx进行硬件集群负载均衡

一、提高硬件质量

  • 更换高性能CPU
  • 关键应用程序数据使用固态硬盘
  • 更换速率更高的网卡,例如万兆网卡
  • 更换更大更快的内存

二、使用LVS做集群负载均衡

LVS是Linux Virtual Server的简写,Linux虚拟服务器,是一个虚拟的服务器集群系统。
Nginx(15)_性能优化
三、使用DNS做集群负载均衡

DNS可以将用户请求分配到不同IP的nginx服务器。
Nginx(15)_性能优化

提高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
Nginx(15)_性能优化

  • 查看net.core.netdev_max_backlog
    cat /proc/sys/net/ipv4/tcp_max_syn_backlog
    Nginx(15)_性能优化
  • 查看net.ipv4.tcp_max_syn_backlog
    cat /proc/sys/net/core/netdev_max_backlog
    Nginx(15)_性能优化
  • 查看net.core.somaxconn
    cat /proc/sys/net/core/somaxconn
    Nginx(15)_性能优化
    sysctl -a | grep somaxconn
    Nginx(15)_性能优化
    修改配置:
    <1> vi /etc/sysctl.conf
    net.ipv4.tcp_max_syn_backlog = 248000
    net.core.somaxconn = 50000
    net.core.netdev_max_backlog = 248000
    Nginx(15)_性能优化
    <2> 重启配置
    sysctl -p
    Nginx(15)_性能优化
    配置nginx.conf
    listen 8080 deferred backlog=248000;

开启TCP FAST OPEN

1、原理

  • 客户端第一次发送SYN进行握手请求,服务端返回给客户端SYN+ACK+Cookie值
  • 客户端发起请求带上ACK+DATA值
  • 当客户端断开连接再次发起连接的时候,直接发送SYN+Cookie+DATA
  • 服务端收到Cookie进行校验,校验完成再发送响应报文,从而省略了初次接收SYN和发送ACK的过程,提高了请求效率。
    Nginx(15)_性能优化

2、配置

  • 查看net.ipv4.tcp_fastopen
    sysctl -a | grep net.ipv4.tcp_fastopen
    Nginx(15)_性能优化
    0:表示关闭fast open功能
    1:表示作为客户端到上游服务器,开启fast open功能
    2:表示作为服务器端,客户端发来请求开启fast open功能
    3:表示作为客户端和服务端都打开fast open功能

  • 修改配置:vi /etc/sysctl.conf
    net.ipv4.tcp_fastopen = 3
    Nginx(15)_性能优化

  • 重启配置查看sysctl -p
    Nginx(15)_性能优化
    Nginx(15)_性能优化