Nginx的listen指令不支持sndbuf配置,需通过Linux内核参数net.core.wmem_default、net.core.wmem_max和net.ipv4.tcp_wmem统一调优TCP发送缓冲区,并配合sendfile on与tcp_nopush on提升外发效率。
listen 指令本身不支持直接设置 sndbuf(发送缓冲区大小)。这个参数属于 TCP socket 层级的底层控制,不能在 nginx 的 listen 指令中配置,也不在 nginx 配置语法范围内。
要优化超高带宽下的数据外发速率,需通过系统级 TCP 缓冲区调优实现,关键参数是:
net.core.wmem_default:socket 默认发送缓冲区大小(字节)net.core.wmem_max:socket 发送缓冲区最大可设值(应用调用 setsockopt(SO_SNDBUF) 时受此限制)net.ipv4.tcp_wmem:TCP 协议栈自动调整范围(min default max),nginx 实际使用的发送缓冲区会在此范围内动态伸缩例如,在 /etc/sysctl.conf 中设置:
net.core.wmem_default = 524288 # 512KBnet.core.wmem_max = 4194304 # 4MBnet.ipv4.tcp_wmem = 4096 524288 4194304
执行 sysctl -p 生效。这些值对所有 TCP 连接(包括 nginx 接受和建立的连接)统一生效。
nginx 本身不显式调用 setsockopt(SO_SNDBUF),而是依赖内核默认行为。但以下两点能影响实际外发效率:
sendfile on:启用零拷贝,绕过用户态缓冲,直接从文件页缓存推送到 socket 发送队列,大幅降低 CPU 和内存拷贝开销,对大文件/视频流尤其关键tcp_nopush on:配合 sendfile 使用,确保内核在 TCP 包满或显式 flush 时才发送,避免小包碎片;而 tcp_nodelay off(默认)允许 Nagle 算法合并小包,提升吞吐确认优化是否起效,不能只看配置,需实测和观测:
ss -i 查看某连接的 wscale、rcv_wscale、snd_wscale 及当前 send-q 大小cat /proc/net/snmp | grep TcpOutSegs 对比调优前后单位时间发包数TcpRetransSegs)和延迟抖动盲目增大 wmem_max 并不一定提升性能:
rmem 参数,否则中间链路 bufferbloat 问题会恶化net.ipv4.tcp_congestion_control = bbr),其自适应窗口机制比静态调大 sndbuf 更有效实际瓶颈常不在发送缓冲区本身,而在网卡驱动、中断聚合、RSS 队列绑定或上游带宽限制。建议先用 ethtool -S 和 perf top 定位真实瓶颈点。