接收窗口与缓冲排查是什么
吞吐上不去时,先看窗口而不是先改参数: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 属于全局影响,生产环境务必先评估并记录原值,便于回退。