收发缓冲决定单连接吞吐上限
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_max | setsockopt 设置接收缓冲的上限 | 应用自己设缓冲时必须同步提高 |
| 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。