排查nginx高并发连接重置,关键在于分层验证是否真由缓冲区/队列引起:先通过日志、tcpdump和ss/netstat确认accept queue溢出或syn队列异常,再同步调大net.core.somaxconn、nginx listen backlog及tcp_max_syn_backlog,同时排除fd耗尽、后端连接池过小和中间设备超时等伪缓冲区干扰。

排查 Nginx 高并发场景下因网络缓冲区过小引发的连接重置,关键不是直接调大某个 buffer 参数,而是定位“缓冲区瓶颈是否真实存在、出现在哪一层、是否被误判为 RST”。很多看似“缓冲区不足”的 Connection reset by peer,实际是内核队列溢出、fd 耗尽或中间设备干预,需分层验证。
先确认是不是真由缓冲区/队列引起
网络缓冲区相关问题常被泛化,但真正由 socket 接收/发送缓冲区 或 内核连接队列 过小导致的 RST 有明确特征:
- 错误日志中伴随
accept() failed (24: too many open files)或accept() failed (11: Resource temporarily unavailable)—— 指向 已完成连接队列(accept queue)满 - tcpdump 抓到大量 SYN+ACK 后无 ACK(三次握手卡在第二步),或客户端发完 ACK 后立刻收到 RST —— 典型 backlog 溢出表现
- 系统级指标异常:运行
ss -lnt查看 Recv-Q/Send-Q 是否持续非零;netstat -s | grep -i "listen overflows"返回值 > 0,说明 accept queue 多次溢出
重点检查和调优三类底层队列
所谓“缓冲区”,在高并发连接建立阶段主要指三个内核队列,Nginx 本身不管理它们,但配置不当会加剧其压力:
-
listen backlog(已完成连接队列):由
net.core.somaxconn和 Nginxlisten ... backlog=共同决定。必须同步调大:
→sysctl -w net.core.somaxconn=65535
→ Nginx server 或 upstream listen 行显式加backlog=65535 -
半连接队列(SYN queue):由
net.ipv4.tcp_max_syn_backlog控制,尤其在 SYN Flood 或突发建连时易溢出。建议设为 ≥ 65535,并启用net.ipv4.tcp_syncookies = 1作兜底 -
socket 缓冲区(rmem/wmem):影响单连接吞吐,但极少直接触发 RST。仅当长肥管道(LFP)场景(如跨洲际、高带宽高延迟)下,
net.ipv4.tcp_rmem最小值过小会导致窗口缩至 0,间接诱发对端 RST。可微调:
→sysctl -w net.ipv4.tcp_rmem="4096 65536 8388608"
→sysctl -w net.ipv4.tcp_wmem="4096 65536 8388608"
排除其他更常见的“伪缓冲区”干扰项
很多团队把以下问题误认为缓冲区故障,实则属于资源或协议层问题,优先排查:
-
文件描述符(fd)耗尽:Nginx worker 进程打开 socket 数超限(
worker_rlimit_nofile未设或过小),导致新 accept 失败并回 RST。查cat /proc/$(pgrep nginx)/limits | grep "Max open files" -
后端连接池太小:例如 Tomcat
acceptCount默认 100,Golang HTTP server 默认 backlog=128,在压测时远低于 Nginx 并发能力,造成 upstream 主动 RST。须与后端参数对齐 - 防火墙或云 SLB 空闲超时:如阿里云 CLB 默认 90 秒断空闲连接,Nginx 复用该连接时发包即收 RST。这不是缓冲区问题,而是会话保持策略不匹配
验证调优是否生效
改完参数不能只等下次故障,要主动验证:
- 重启 Nginx 后运行:
ss -lnt | grep :80,确认Recv-Q列最大值接近你设的backlog值(如 65535) - 压测中实时监控:
watch -n 1 'netstat -s | grep -A2 "listen overflows"',确认数值不再增长 - 抓包复现请求流:对一个稳定复现 RST 的请求,用
tcpdump -i any port 80 -w test.pcap,过滤其 TCP 流,观察是 SYN→SYN+ACK→RST(backlog 溢出),还是 ESTABLISHED 后某次 read/write 突然 RST(后端或协议问题)











