Stream模块通过绕过应用层解析、复用事件循环、精简连接管理及系统级调优提升四层转发性能:零协议解析、共享epoll/kqueue、so_keepalive与proxy_timeout协同、调优内核网络参数。

Stream 模块提升四层转发性能,核心在于绕过应用层解析、复用底层事件循环、精简连接状态管理,并协同系统级参数优化。它不处理协议内容,只做字节流透传,因此延迟低、吞吐高、内存开销小。
复用统一事件循环,避免重复调度开销
Stream 和 HTTP 模块共享同一套 epoll(Linux)或 kqueue(BSD)事件驱动模型,worker 进程统一监听、accept、读写和超时管理所有连接。这意味着:
- 无需为 TCP/UDP 转发单独启动新循环,减少进程/线程切换和资源竞争
- 所有 socket 句柄由相同 worker 处理,缓存局部性更好,syscall 更高效
- 必须在 events 块中设 use epoll; 和足够大的 worker_connections(如 1048576),否则事件循环成为瓶颈
零解析透传,降低 CPU 与内存压力
Stream 不解包 HTTP 头、不校验 TLS record、不重写任何字段,只做 memcpy 级别转发:
- TCP 场景:收到 client 数据 → 直接写入 backend socket 缓冲区;backend 回包 → 直接写回 client
- UDP 场景:单个数据报到达 → 查 upstream → 整包转发,无拆分、无合并、无顺序保证
- proxy_buffer_size 设置合理(如 256K~1M)可减少小包 syscall 次数,但过大易耗尽内存
精准控制连接生命周期,防止僵死与误断
长连接稳定性依赖内核保活与 Nginx 超时策略的协同:
- so_keepalive=60s:10s:3:空闲 60 秒后开始探测,每 10 秒一次,连续 3 次失败断连,适配主流云 NAT 超时
- proxy_timeout 必须 ≥ keepalive 总探测时间(如 60 + 10×3 = 90 秒),建议设为 2m~1h,避免提前关闭
- proxy_responses 1:仅等待首包响应即确认建连成功,比三次握手更可靠,防后端监听但未就绪
系统级参数同步调优,释放网络栈潜力
Stream 性能直接受限于 OS 网络栈能力,必须配套调整:
- 增大文件描述符上限:worker_rlimit_nofile 2097152,并配置
/etc/security/limits.conf - 提升连接队列:net.core.somaxconn = 65535,防 SYN 队列溢出
- 加速 TIME_WAIT 回收:net.ipv4.tcp_tw_reuse = 1(客户端主动连接时生效)
- 缩短 FIN 超时:net.ipv4.tcp_fin_timeout = 15,加快连接释放



















