调整TCP缓冲区需先按BDP(带宽×RTT÷8)计算合理值,如1Gbps+50ms→BDP≈6.25MB,再设tcp_rmem/wmem最大值为8–12MB,并同步调大rmem_max/wmem_max至相同或更高,且必须启用tcp_window_scaling=1,否则窗口仍被限制在64KB。

直接调大 TCP 最大缓冲区本身不会自动提升吞吐,关键是要让它能真正生效,并匹配网络实际能力。核心在于让滑动窗口撑满带宽延迟积(BDP),同时解除内核限制。
先算清楚需要多大
吞吐卡住常见原因是窗口太小,而窗口上限直接受缓冲区限制。计算公式很简单:
- BDP(字节)= 带宽(bps)× RTT(秒)÷ 8
- 例如:1Gbps 链路 + 50ms RTT → BDP ≈ 6.25MB
- 建议最大值设为 BDP 的 1.3–1.5 倍,留出余量,比如设为 8–12MB
必须同步改两组参数
只改 tcp_rmem/tcp_wmem 的最大值没用,因为它们受全局上限约束:
- net.core.rmem_max / net.core.wmem_max:所有 socket 的硬上限,单位字节,必须 ≥ tcp_rmem/wmem 的第三个值
- net.ipv4.tcp_rmem / net.ipv4.tcp_wmem:TCP 连接的三元组(最小、默认、最大),第三个数才是你设的“最大值”
- 比如设 tcp_rmem="4096 262144 8388608",那 rmem_max 至少得是 8388608(即 8MB)
别忘了开窗口缩放
即使缓冲区调大了,如果没启用窗口缩放,TCP 通告窗口仍被锁死在 65535 字节(64KB),再大的缓冲也没法用:
- 执行 sysctl -w net.ipv4.tcp_window_scaling=1
- 永久生效就写入 /etc/sysctl.conf:net.ipv4.tcp_window_scaling=1
- 这个参数必须开启,高延迟或高带宽场景下缺它等于白调
验证是否真正起效
改完不能只信配置文件,要看实际运行效果:
- 查当前设置:sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem net.core.rmem_max
- 看单个连接实时值:ss -i dst [IP]:[PORT],关注 rmem 和 wmem 列
- 观察吞吐变化:用 iperf3 或业务流量对比,确认带宽利用率是否明显上升


















