TCP缓冲区调优需匹配带宽延迟积(BDP),公式为BDP=带宽(字节/秒)×RTT(秒),推荐设为BDP的1.2–1.5倍;必须同步调整net.core.rmem_max、net.core.wmem_max、tcp_rmem、tcp_wmem四参数,并启用tcp_window_scaling和BBR拥塞控制。
调 TCP 缓冲区不是简单“越大越好”,而是要让接收/发送窗口能撑开到匹配你实际链路的带宽延迟积(BDP),否则窗口卡在 64KB,再快的网也跑不满。
核心公式是:BDP = 带宽(字节/秒) × RTT(秒)。比如:
缓冲区最大值建议设为 BDP 的 1.2–1.5 倍,留点余量应对抖动。别直接套用网上“全设 16MB”的通用值——小带宽低延迟场景设太大反而浪费内存、拖慢响应。
必须同时调整,缺一不可:
4096 524288 8388608 表示最小 4KB、默认 512KB、最大 8MB例如针对 1Gbps + 50ms 场景,可设:
net.core.rmem_max = 12582912net.core.wmem_max = 12582912
net.ipv4.tcp_rmem = 4096 524288 12582912
net.ipv4.tcp_wmem = 4096 262144 12582912
TCP 头部窗口字段只有 16 位,不启用缩放就永远卡在 65535 字节(64KB)。执行:
sysctl -w net.ipv4.tcp_window_scaling=1 并写入 /etc/sysctl.conf
tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' 抓包看单调缓冲区效果有限,建议一并配置:
net.ipv4.tcp_congestion_control = bbr
改完执行 sysctl -p 生效,用 ss -i 查看活跃连接的 rcv_wnd/snd_wnd 是否已突破 64KB。