tcp单流吞吐上限由带宽时延积(bdp)决定,接收缓冲区(rmem_max)必须≥bdp且配合tcp_rmem最大值与窗口缩放启用,否则窗口无法撑开导致链路利用率不足。

直接调大 net.core.rmem_max 本身不会提升单流吞吐量,但它为 TCP 自动调优提供上限保障——真正起作用的是 net.ipv4.tcp_rmem 的最大值配合窗口缩放(tcp_window_scaling=1),而 rmem_max 必须 ≥ 这个最大值,否则会被截断。
为什么高延迟链路需要更大的接收缓冲区
单流 TCP 吞吐量理论上限由带宽时延积(BDP)决定:BDP = 带宽 × 往返时延(RTT)。例如:
- 1Gbps 链路 + 200ms RTT → BDP ≈ 25MB
- 10Gbps 链路 + 100ms RTT → BDP ≈ 125MB
如果接收缓冲区上限(rmem_max)低于 BDP,TCP 接收窗口就无法撑开到理论最大值,导致链路“吃不饱”,即使带宽充足也跑不满。
关键配置步骤与数值建议
三步必须同步完成,缺一不可:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 启用 TCP 窗口缩放:
net.ipv4.tcp_window_scaling = 1(默认通常已开启,但需确认) - 设好 TCP 接收窗口三元组:
net.ipv4.tcp_rmem = 4096 262144 33554432(即 min=4K, default=256K, max=32M) - 将
net.core.rmem_max设为 ≥ 上述第三项(32M),推荐设为 33554432 或 67108864(64M),留出余量
执行命令示例:
sudo sysctl -w net.ipv4.tcp_window_scaling=1<br>sudo sysctl -w net.ipv4.tcp_rmem="4096 262144 33554432"<br>sudo sysctl -w net.core.rmem_max=67108864
写入配置文件持久化(如 /etc/sysctl.d/99-network-performance.conf)后运行 sudo sysctl -p 生效。
验证是否生效
不能只看参数值,要确认实际窗口是否拉满:
- 用
ss -i查看某条活跃连接的rcv_wnd(接收窗口)和rcv_space(可用接收空间),两者应接近你设的 max 值(如 32M) - 用
cat /proc/sys/net/core/rmem_max和cat /proc/sys/net/ipv4/tcp_rmem核对数值 - 跑一次 iperf3 单流测试(加
-w 32M指定 socket 缓冲区),对比调优前后吞吐变化
注意事项与常见陷阱
容易忽略但影响实际效果的关键点:
-
rmem_max是 per-socket 上限,应用层若用setsockopt(SO_RCVBUF)手动设缓冲区,也不能超过它 - 仅增大
rmem_max而不调tcp_rmem的 max 项,TCP 窗口仍被限制在默认值(通常 212KB),毫无意义 - 内存不是无限的:32M 缓冲区 × 数万连接会耗尽内存,需结合
net.ipv4.tcp_mem合理设置全局 TCP 内存阈值 - 网卡环形缓冲区(ring buffer)也要同步调大(
ethtool -G eth0 rx 4096),否则数据在进内核前就被丢弃










