首页/网络/网络排障速查/接收窗口与缓冲排查(不做玄学调参)

接收窗口与缓冲排查(不做玄学调参)

吞吐上不去先看窗口:ss -i 的 rwnd/wscale 与内核 rmem/wmem 决定了在途数据上限;定位清楚再改参数,避免无脑调优。

网络排障速查网络更新于 2026-10-13

接收窗口与缓冲排查是什么

吞吐上不去时,先看窗口而不是先改参数:ss -i 里的 rwnd、cwnd、wscale 与内核 tcp_rmem/tcp_wmem 共同决定在途数据的上限。若 rwnd 长期贴住上限,说明接收端在限制发送方;若 rwnd 长期很小甚至出现零窗口,往往不是内核参数问题,而是应用读数据太慢。定位清楚再动手,避免照抄所谓『万能内核参数』。

基本信息

适用平台Linux(内核 4.x 以上,自动调优默认开启)
查看命令ss -tni、sysctl net.ipv4.tcp_rmem/tcp_wmem/tcp_window_scaling
关键概念带宽时延积(BDP)= 带宽 × RTT,决定所需窗口大小
前提先确认瓶颈在窗口,再评估是否调整参数

典型使用场景

  • 跨地域链路吞吐远低于带宽:用 BDP 判断现有窗口是否够用
  • 下载慢但上传正常:优先检查接收侧 rwnd 与 wscale
  • 应用间歇卡顿:排查是否出现零窗口,即应用层读数据过慢
  • 参数变更前的取证基线:记录改前的 rwnd/cwnd 与吞吐,改后才有对照

查看与调整

查看与调整
# 查看已建立连接的窗口与拥塞信息
ss -tni state established '( dport = :443 )' | head -20
# 确认窗口缩放与缓冲上限是否开启
sysctl net.ipv4.tcp_window_scaling net.ipv4.tcp_rmem net.ipv4.tcp_wmem
# 观察 socket 内存整体使用
cat /proc/net/sockstat | head -3
# 临时验证(生产环境先评估并记录原值)
sysctl -w net.ipv4.tcp_rmem='4096 131072 16777216'

关键字段判读

字段含义异常指向
rwnd接收窗口可用空间长期贴住上限,说明接收侧在限制发送
wscale窗口缩放因子为 0 时窗口被限制在 64KB,长肥管道必然受限
cwnd拥塞窗口增长缓慢或频繁回落,指向丢包或链路抖动
retrans重传计数非零且增长,需先解决丢包再谈窗口
零窗口接收窗口为 0应用读数据过慢,是接收端应用问题不是内核参数
『接收窗口长期很小』多数不是内核参数问题:先在两端用 ss -i 对照,确认是发送侧被限还是接收侧应用消费太慢,再决定是否调整内核参数。
内核自动调优(tcp_moderate_rcvbuf)在绝大多数场景下已够用:手工改 tcp_rmem/tcp_wmem 属于全局影响,生产环境务必先评估并记录原值,便于回退。

易错点

  • 照抄网上『万能内核参数』:不同负载与链路的合理取值完全不同,可能引入内存压力
  • 忽略应用读取慢这一根本原因:只调内核参数,零窗口现象依旧
  • 不看 wscale 只调缓冲:窗口缩放未开启时,最大窗口被限制在 64KB,调参数无效
  • 在有丢包的链路上调窗口:重传导致的吞吐下降会掩盖窗口调整的效果,归因错误
  • 只在接收端调参不管发送端:跨机房场景两端都要评估,单侧调整常常无效

数据来源与参考

  • RFC 7323:窗口缩放选项
  • Linux 内核文档:tcp_rmem/tcp_wmem

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌