玖叶教程网

前端编程开发入门

容器中Nginx高并发参数调优实战(nginx高并发优化)

在容器化的微服务架构中,Nginx作为反向代理和负载均衡器,常常需要承担高并发访问的压力。当并发连接数超过Nginx可处理的上限时,就会出现新连接被丢弃的情况。本文将详细介绍如何发现和定位这个问题,并通过调整内核参数和Nginx配置来解决。


一、问题现象

某Web服务在高并发场景下,偶尔会出现部分请求无响应的情况。经过初步排查,后端服务器运行正常,猜测可能是Nginx无法及时处理新连接请求导致的。

$ netstat -s | grep -E 'overflow|drop'
    12778639 times the listen queue of a socket overflowed
    12647895 SYNs to LISTEN sockets dropped
全连接队列满了:xxx times the listen queue of a socket overflowed
半连接队列满了:xxx SYNs to LISTEN sockets dropped
    


$ ss -lnt
State      Recv-Q Send-Q Local Address:Port                Peer Address:Port
LISTEN     129    128                *:80                             *:*
当 Recv-Q 的值比 Send-Q 大 1 时表明 accept queue 溢出了,如果再收到 SYN 包就会丢弃掉。  
    


$ cat /proc/sys/net/ipv4/tcp_syncookies
1
syncookies 是为了防止 SYN Flood 攻击 (一种常见的 DDoS 方式),
攻击原理就是 client 不断发 SYN 包但不回最后的 ACK,
填满 server 的 syn queue 从而无法建立新连接,导致 server 拒绝服务。


二、确认问题原因

1.抓包分析通过tcpdump抓取Nginx所在节点的网络数据包,发现存在大量TCP连接在SYN_RECV状态下被主动重置的现象。这种情况一般说明,Nginx在接收到SYN包后,没有足够的资源分配给新连接,导致Accept Queue满后的新连接被丢弃。

2.Accept Queue 慢导致丢包Linux中的Accept Queue大小,由内核参数net.core.somaxconn和Nginx配置的backlog共同决定。当新连接到达速率超过Accept Queue的处理速度时,就会出现丢包。


三、调优Accept Queue大小

1.调整内核参数net.core.somaxconnsomaxconn参数限制了系统范围内所有监听Socket队列的最大长度。可以通过如下命令持久修改:

echo 'net.core.somaxconn=65535' >> /etc/sysctl.conf
sysctl -p


2.调整Nginx backlog大小Nginx中的backlog参数限制了每个监听Socket队列的最大长度。编辑nginx.conf,增大backlog值:

events {
    worker_connections 65535;  
    multi_accept on;
}  

http {
    ...
    server {
        listen 80 backlog=8192;
        ...
    }
}


3.重载Nginx使配置生效

nginx -s reload


四、调优效果验证

调整参数后,通过监控Nginx活跃连接数,在高并发场景下未再出现丢包和无响应的情况。


五、其他可选调优

除了增大Accept Queue长度,还可以考虑以下调优手段:

1.增加Nginx Worker进程数

2.开启多核负载均衡

3.优化上游服务性能

4.缓存静态资源

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言