调大 net.core.wmem_max 能提升大数据传输性能,但须结合 bdp 计算目标值,并同步调整 wmem_default、tcp_wmem 和 tcp_window_scaling,否则易引发内存压力或无效。

直接调大 net.core.wmem_max 能显著改善大数据量传输性能,但必须结合网络场景和配套参数协同调整,否则效果有限甚至引发内存压力。
明确 wmem_max 的作用边界
这个参数不是“越大越好”的独立开关,而是套接字发送缓冲区的硬性上限。应用程序(如 Nginx、rsync、自研服务)调用 setsockopt(SO_SNDBUF) 时,能申请的最大缓冲区不能超过该值。内核默认值通常为 212992 字节(约 208KB),对千兆以上带宽或 RTT >50ms 的链路明显不足。
- 它不控制每个连接实际使用的缓冲区大小,只设上限;真实大小由
net.ipv4.tcp_wmem的第三个值(max)和应用层设置共同决定 - 单个连接不会自动占满 wmem_max,除非应用显式调大 SO_SNDBUF 或启用了自动缩放(
net.ipv4.tcp_window_scaling=1) - 总内存占用 = 并发连接数 × 实际使用缓冲区大小,盲目设高可能挤占其他内存资源
按场景合理设定目标值
推荐值不是固定数字,而应匹配你的带宽延迟积(BDP)。计算公式:BDP = 带宽(B/s) × 往返时延(s)。wmem_max 至少应 ≥ BDP,再留 20% 余量。
- 10Gbps + 10ms RTT → BDP ≈ 12.5MB → 建议设为 16777216(16MB)
- 1Gbps + 100ms RTT(如跨洲传输)→ BDP ≈ 12.5MB → 同样建议 16MB
- 普通内网 1Gbps + 0.5ms RTT → BDP ≈ 64KB → 默认值已足够,无需调整
必须同步调整的关键配套参数
wmem_max 单独调大无效,需与以下三个参数保持逻辑一致:
- net.core.wmem_default:设为略低于 wmem_max 的常用值(如 262144 或 8388608),确保新连接有足够初始缓冲
-
net.ipv4.tcp_wmem:三元组格式
min default max,其中max应等于或略小于 wmem_max(如4096 65536 16777216) - net.ipv4.tcp_window_scaling:必须设为 1,否则 TCP 窗口无法突破 64KB,大缓冲区形同虚设
安全落地的操作步骤
避免直接改 /etc/sysctl.conf,推荐使用模块化配置:
- 新建文件
/etc/sysctl.d/99-tcp-tuning.conf,写入:
net.core.wmem_default = 8388608
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1
- 执行
sudo sysctl --system(比sysctl -p更可靠,自动加载所有.d/下配置) - 验证生效:
sysctl net.core.wmem_max net.ipv4.tcp_wmem - 观察效果:用
ss -i查看活跃连接的实际 snd_buf 值,或用iperf3对比调优前后吞吐











