nginx tcp代理吞吐量瓶颈在内核与连接管理,需协同调优:增大tcp队列、复用time-wait端口、扩展文件句柄与缓冲区、启用epoll及so_keepalive,并禁用日志。

Nginx 的 TCP 代理(即 stream 模块)不解析应用层协议,只做四层转发,吞吐量瓶颈几乎全在系统内核和连接生命周期管理上,而非 Nginx 配置本身。要提升数据转发吞吐量,核心是让每个连接“建得快、传得稳、关得利、复用好”。
调优 Linux 内核 TCP 队列与连接接纳能力
TCP 代理对连接洪峰极其敏感,SYN 包被丢会导致客户端直接报 Connection refused。必须确保内核队列能接住 Nginx 的监听负载:
-
net.core.somaxconn = 65535:监听 socket 全连接队列上限,必须 ≥stream { server ... listen ... backlog=65535; }中的backlog值 -
net.ipv4.tcp_max_syn_backlog = 65535:半连接队列容量,应对突发握手,低于somaxconn会静默丢 SYN -
net.core.netdev_max_backlog = 262144:网卡软中断收包队列,防高速入包时内核来不及处理而丢包
加速短连接端口回收与复用
Redis、MySQL 等后端代理常产生大量短连接,TIME-WAIT 堆积会耗尽本地端口(报 Cannot assign requested address):
-
net.ipv4.tcp_tw_reuse = 1:允许 TIME-WAIT 端口快速复用于出向连接(Nginx 主动连后端时生效) -
net.ipv4.ip_local_port_range = 1024 65535:扩大临时端口范围,可用端口从约 3.2 万增至 6.4 万 -
net.ipv4.tcp_fin_timeout = 30:缩短 FIN_WAIT_2 超时,加快连接彻底关闭 -
net.ipv4.tcp_tw_recycle = 0:该参数在 NAT/负载均衡环境下必禁用,已废弃,设为 0
放宽系统资源与网络缓冲上限
TCP 代理虽不解析内容,但高吞吐依赖稳定的大缓冲和充足句柄:
-
fs.file-max = 2097152:系统级最大文件描述符数,应 ≥worker_processes × worker_rlimit_nofile -
net.core.rmem_max = 16777216、net.core.wmem_max = 16777216:单连接收发缓冲上限提至 16MB -
net.ipv4.tcp_rmem = "4096 65536 8388608"、net.ipv4.tcp_wmem = "4096 16384 16777216":启用自动缩放,兼顾小包低延迟与大流吞吐 -
vm.swappiness = 1:极低交换倾向,避免内存压力下触发 swap,拖慢代理延迟
Nginx stream 层关键配置协同
内核调优需配合 Nginx 运行时设置才能生效:
-
worker_processes auto;+worker_rlimit_nofile 65535;:绑定全部 CPU 核心,放开句柄限制 -
events { use epoll; multi_accept on; accept_mutex off; }:启用高效事件模型,允许多个连接一次性接受 -
stream { upstream backend { server 10.0.1.10:6379; } server { listen 6380 so_keepalive=on; proxy_pass backend; } }:开启so_keepalive减少空闲连接断连;proxy_pass不做额外处理,保持零拷贝路径 - 禁用日志:
access_log off; error_log /dev/null warn;—— 小包高频场景下磁盘 I/O 是隐形吞吐杀手
不复杂但容易忽略











