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