首页/系统/Linux 内核与性能调优速查/net.core.wmem_default 默认发送缓冲
网络栈调优98 条

net.core.wmem_default 默认发送缓冲

socket 初始发送缓冲;高带宽单流场景常需应用显式调大 wmem,而不是只改全局默认。

什么是 wmem_default

net.core.wmem_default 与 net.core.wmem_max 分别对应发送缓冲的初始值与上限。发送缓冲大小直接影响单流在途数据量:低于链路带宽延迟积时,应用会被阻塞在写操作上,吞吐无法跑满;但把缓冲调得过大也会让背压反馈变迟钝,应用察觉不到网络拥塞,延迟与内存占用同时上升。

基本信息

参数路径net.core.wmem_default / net.core.wmem_max
单位字节
TCP 侧对应net.ipv4.tcp_wmem 的 min/default/max
应用覆盖setsockopt(SO_SNDBUF),内核通常会按协议做调整
观测ss -tmn 的 skmem 中 w 与 tb 值
权衡吞吐 ↑ ↔ 延迟与内存 ↑

典型使用场景

  • 大文件传输或数据同步吞吐上不去:确认发送缓冲是否够支撑在途数据
  • 高带宽长延迟链路:按带宽延迟积估算需要的发送缓冲
  • 延迟敏感服务:避免缓冲过大导致排队时间增加
  • 与应用侧 SO_SNDBUF 设置差异的对照排查
  • 压测前的参数标准化,避免不同机器参数不一致影响结论

查看与核对

查看与核对
sysctl net.core.wmem_default net.core.wmem_max
sysctl net.ipv4.tcp_wmem                   # TCP 专用区间
ss -tmn dst :443 | head -4                 # 看 skmem 的 w/tb
ss -tmn | grep -m3 -o 'skmem:[^ ]*'
# 带宽延迟积估算:1Gbps × 20ms ≈ 2.5MB 在途数据
sysctl -w net.core.wmem_default=262144     # 示例调整(需评估)
# 变更后复查:重传比例、应用写阻塞时间、P99 延迟

调整路径对比

路径适用代价
应用 setsockopt单服务精确控制需要改代码或配置
tcp_wmemTCP 全局区间影响所有 TCP 连接
core.wmem_default非 TCP 或未显式设置的应用所有相关连接一起变化
依赖自动调节TCP 默认行为可调空间受上限约束
发送缓冲的实际值内核会参与调整,用 ss 读到的 skmem 往往与 setsockopt 传入值不一致,这属于正常现象,判断以运行时读数为准。
缓冲过大会推迟背压反馈:应用以为写得很快,实际数据堆在网络层,出现延迟升高与内存占用增长并存的局面。
大带宽场景优先在应用侧设置 SO_SNDBUF 或依赖 TCP 自动调优;全局默认值改动影响面大,收益与风险往往难以对齐。

易错点

  • 小包高频流量盲目调大缓冲收益有限,先看丢包与重传,再判断瓶颈是否真在缓冲
  • 过大缓冲会推迟背压反馈,加剧延迟与内存占用,延迟敏感业务尤其要克制
  • 改了 sysctl 却发现单连接没变化:应用显式设置了 SO_SNDBUF 时以应用值为准
  • 老连接不受新参数影响,验证必须用新建立的连接,否则会得出“改了没用”的错误结论

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌