首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_wmem 发送缓冲自动调优
sysctl 内核参数72 条

net.ipv4.tcp_wmem 发送缓冲自动调优

发送侧缓冲自动调优的 最小/默认/上限(默认 4096 16384 4194304);大流量回源或推流场景可放宽上限提升突发吸收能力。

tcp_wmem 是什么

net.ipv4.tcp_wmem 是 TCP 发送缓冲自动调优的三个边界值:最小、默认、最大,单位为字节,默认组合为 4096、16384、4194304。发送缓冲决定单连接可以积压多少已发出但尚未被确认的数据,内核会根据拥塞窗口与路径情况自动调整。大流量回源、推流、跨机房数据同步这类以发送为主的场景,放宽上限能提升对突发的吸收能力;而低延迟业务反而希望它保持较小。

基本信息

参数net.ipv4.tcp_wmem = 最小值 默认值 最大值
默认值4096 16384 4194304(以本机回读为准)
单位字节,写入时三个数字用空格分隔并整体加引号
与 core 参数关系应用显式 setsockopt 走 net.core.wmem_max,自动调优走这里的第三值
作用限制单连接可积压的未确认数据量
观测方式ss 的 Send-Q 显示发送队列积压,ss -tmi 可看缓冲统计

典型使用场景

  • 反向代理回源与大文件下发:发送侧需要更大的缓冲吸收对端处理抖动
  • 推流与日志上报:突发流量下减少因缓冲不足造成的应用写入阻塞
  • 排查写入阻塞:应用阻塞在写操作上时,确认是本地缓冲已满还是对端窗口为零
  • 低延迟服务评估:交易与实时通信类业务反而希望缩小缓冲,避免排队延迟
  • 跨机房链路上传:高 RTT 下需要更多在途数据才能跑满带宽

查看与调整

查看与调整
sysctl net.ipv4.tcp_wmem                # 读三档值
sysctl net.core.wmem_max                # 应用显式设置时受它限制
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"   # 放宽最大档
ss -ti | grep -E 'skmem|wscale|cwnd'    # 观察发送侧缓冲与拥塞窗口
ss -tn state established | awk '{print $3}' | sort -rn | head   # 看 Send-Q 最大的连接

三档值读法

位置含义调整影响
第一个值内存紧张时允许收缩到的最小发送缓冲过小会让发送窗口骤降,吞吐抖动明显
第二个值新建连接的初始发送缓冲影响小请求起步的写入是否立刻阻塞
第三个值自动调优上限大 BDP 链路的单连接在途数据上限
net.core.wmem_max应用显式设置的上限与自动调优是两个独立边界,容易漏改
发送缓冲积压多不一定是好事:缓冲区占用内存,还会把排队延迟留在本机上。对延迟敏感的交易类与实时通信类业务,保持较小的发送缓冲往往比追求大吞吐更合适。
写入阻塞时要先分清方向:用 ss 看 Send-Q 是否长期不为零,再结合对端的接收窗口判断。如果是对端读得慢,本地加大缓冲只是把问题推迟,最终仍会阻塞应用写入。

易错点

  • 与 net.core.wmem_max 混用两个边界:显式设置与自动调优是两条路径,需要分别核对
  • 盲目加大发送缓冲:内存占用与排队延迟同步上升,低延迟业务可能因此变差
  • 期望对存量连接生效:参数在连接建立时取值,必须新建连接验证
  • 把发送缓冲当作解决对端慢的手段:对端接收窗口为零时,本地缓冲再大也终将写满
  • 写入时带单位或漏加引号:三个数字被拆开处理,加载失败或值不符合预期

数据来源与参考

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