优化TCP缓冲区需匹配带宽、RTT与连接规模,先计算BDP(如10Gbps+20ms→25MB),设tcp_rmem/wmem最大值≥BDP,并同步调高rmem_max/wmem_max;必须启用tcp_window_scaling、tcp_timestamps,推荐BBR算法,最后用ss -i验证rcv_wnd是否突破64KB。

优化 TCP 缓冲区大小是提升 Linux 并发吞吐的关键动作,但不能只调大数值——必须匹配网络带宽、RTT 和连接规模三者关系,否则反而引发内存压力或延迟升高。
先算清楚带宽延迟积(BDP)
缓冲区上限需至少覆盖 BDP(Bandwidth × RTT),否则滑动窗口打不开,吞吐就被卡死:
- 10Gbps 链路 + 20ms RTT → BDP ≈ 25MB,tcp_rmem 最大值建议 ≥ 32MB
- 1Gbps + 100ms(跨洲链路)→ BDP ≈ 12.5MB,最大值设为 16MB 较稳妥
- 高并发小连接场景(如 API 网关),默认值可压到 64KB–256KB,避免单连接吃掉过多 buff/cache 内存
正确设置四组核心参数
缓冲区受多层限制,必须同步调整,缺一不可:
- net.core.rmem_max / wmem_max:全局上限,单位字节,必须 ≥ tcp_rmem/wmem 的最大值;例如设为 16777216(16MB)
- net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem:每连接三元组(min default max),如 "4096 262144 16777216"(4KB / 256KB / 16MB)
- 若用 BBR 拥塞算法,建议 default 值设高些(如 512KB),帮助其快速探窗
必须启用窗口缩放与配套机制
没有窗口缩放,TCP 头部无法表达 >64KB 的通告窗口,再大的缓冲区也无效:
- 确认开启:net.ipv4.tcp_window_scaling = 1(两端都需为 1)
- 启用时间戳:net.ipv4.tcp_timestamps = 1(tcp_tw_reuse 和 BBR 都依赖它)
- 搭配 BBR 拥塞控制:net.ipv4.tcp_congestion_control = bbr,比 CUBIC 更适应大窗口和高 RTT
验证是否真正生效
别只看 sysctl 输出,要查运行中的连接实际值:
- 查当前配置:
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem - 查活跃连接窗口与缓冲使用:
ss -i dst <server_ip>,关注 rcv_wnd、snd_wnd、rmem、wmem 列 - 若 rcv_wnd 长期卡在 65535(64KB),说明窗口缩放未生效或对端不支持


















