首页/网络/协议速查/TCP 收发缓冲调优(rmem/wmem)
TCP 与 UDP54 条

TCP 收发缓冲调优(rmem/wmem)

tcp_rmem/tcp_wmem 各含 min/default/max 三值,内核默认自动调优;跨地域高带宽时延积场景需要提高 max 才能跑满带宽。

协议速查网络更新于 2026-10-13

收发缓冲决定单连接吞吐上限

TCP 的吞吐上限受窗口大小约束:在途数据量最多等于带宽乘以往返时延(BDP)。tcp_rmem 与 tcp_wmem 各含最小值、默认值、最大值三个数字,内核默认会自动调优,但在跨地域高带宽时延积场景下,自动调优的上限仍可能不够,导致单连接跑不满带宽——这是「带宽明明够、下载就是快不起来」的常见原因。

基本信息

参数形态net.ipv4.tcp_rmem 与 net.ipv4.tcp_wmem 均为 min default max 三值
自动调优net.ipv4.tcp_moderate_rcvbuf 默认开启,接收缓冲按需增长到 max
max 的意义自动调优的天花板,直接限制单连接窗口上限
窗口缩放net.ipv4.tcp_window_scaling 默认开启,窗口超过 64KB 时必需
相关参数net.core.rmem_max 与 wmem_max 是应用 setsockopt 设置时的上限

参数读法

参数作用调整建议
tcp_rmem接收缓冲的 min default max高带宽时延积场景提高 max
tcp_wmem发送缓冲的 min default max与 rmem 配套调整
tcp_moderate_rcvbuf接收缓冲自动调优开关保持 1
net.core.rmem_maxsetsockopt 设置接收缓冲的上限应用自己设缓冲时必须同步提高
tcp_window_scaling窗口缩放选项保持开启,否则窗口不超过 64KB

查看与调整

查看与调整
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem
# 例:net.ipv4.tcp_rmem = 4096 131072 6291456
sysctl -w net.ipv4.tcp_rmem='4096 262144 16777216'    # 提高自动调优上限
ss -tim                                                # 观察单连接的 rcv 缓冲与窗口
# 估算所需窗口:BDP = 带宽(Mbit/s) 除以 8 乘以 RTT(秒),单位换算为字节

典型使用场景

  • 跨地域专线单连接跑不满带宽时,按 BDP 校验窗口是否足够
  • 文件分发与备份系统调优:大文件传输对接收缓冲更敏感
  • 排查「多连接能跑满、单连接不行」:典型就是单连接窗口受限
  • 窗口缩放被关闭的旧设备互操作排查
单连接跑不满带宽时,先算 BDP 再对照 rmem 的 max 是否够用,其次看拥塞控制算法与丢包率;盲目调大缓冲而忽略拥塞控制往往收益有限。
盲目调大 max 会把内存压力转嫁给整机:并发连接数乘以 max 是潜在的内存占用上限,高并发场景下内核内存耗尽会触发分配失败甚至 OOM。

易错点

  • 盲目调大 max 引发内存压力:高并发时内核内存耗尽会触发 OOM 或分配失败,反而降低稳定性
  • 应用自己 setsockopt 设置了缓冲却没提高 net.core.rmem_max:设置被内核静默截断,以为调优生效其实没有
  • 忽略 tcp_window_scaling:关闭后窗口上限 64KB,长肥管道上吞吐被硬性限制
  • 按平均值估算 BDP:要用峰值带宽与最坏 RTT 估算,按平均值算出来的窗口在网络抖动时仍然不够

数据来源与参考

  • man 7 tcp
  • Linux 内核文档(tcp_rmem/tcp_wmem)

相关工具

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