TCP参数调优:跨境链路上改哪几个内核参数最管用

跨境传输速度上不去,很多时候不是带宽不够,是TCP协议栈的参数没调对。默认配置是为低延迟、低丢包的网络设计的,放到跨太平洋链路上就是水土不服。

调哪些参数能明显改善速度,列几个实测有效的方向。

一、先把拥塞控制算法换了

这是改动最小、效果最明显的一步。Linux 4.9以上内核内置了BBR,默认没开,目前大多数服务器还在跑cubic。

cubic的逻辑是"丢包等于拥塞",检测到丢包就主动降速。跨境链路丢包是常态,cubic会频繁踩刹车,带宽买再多也跑不上去。BBR的思路不一样,它持续测量链路的实际带宽和最小RTT,在两者之间找平衡点------把带宽跑满,同时尽量不让数据在中间设备缓存里堆积。

实测数据:BBR部署后吞吐量提升20%-50%的情况很常见。开启方式只需要两行配置:

text

复制代码
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

写进/etc/sysctl.conf,执行sysctl -p生效。用sysctl net.ipv4.tcp_congestion_control确认切换成功。

二、缓冲区大小要扩,跨境场景下默认值不够用

TCP传输依赖接收窗口和发送窗口,窗口大小决定了单条连接能跑多快。窗口太小,就算带宽充足,数据也发不出去。

公式是:吞吐量 = 窗口大小 / RTT。RTT 200ms的链路上,要达到100Mbps吞吐量,窗口需要2.5MB。默认的缓冲区往往只有几十KB,远不够用。

跨境场景下把缓冲区扩到16MB比较稳妥,留足余量:

text

复制代码
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

四个参数的含义:rmem/wmem分别是接收和发送缓冲区,max是上限,后面的三个值是"最小-默认-最大"。tcp_rmem和tcp_wmem的默认值和最大值决定了每条TCP连接的实际可用窗口。

三、TIME_WAIT积压会拖慢建连速度

大量短连接场景下,主动关闭连接的一端会积累大量TIME_WAIT状态。系统默认TIME_WAIT要等2MSL(约60秒)才能释放端口,端口资源消耗快了,新连接就可能建不起来。

两个参数配合使用:

text

复制代码
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

tcp_tw_reuse允许新连接复用TIME_WAIT状态的socket(注意只在出站连接有效),tcp_fin_timeout缩短FIN-WAIT-2的等待时间。同时检查本地端口范围够不够:

text

复制代码
net.ipv4.ip_local_port_range = 1024 65000

默认范围通常是32768-60999,高并发场景下可能不够用,扩到1024-65000能缓解端口耗尽。

四、队列长度调大,防止高并发时连接被丢弃

高并发场景下,连接队列满了新连接就会被丢掉,用户端表现为"连不上"。两个队列参数值得调:

text

复制代码
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 10000

somaxconn控制已完成三次握手的连接队列长度,tcp_max_syn_backlog控制半连接队列(SYN_RECV状态)长度,netdev_max_backlog是网卡收包队列。默认值128和1024,流量稍微上来就不够用。

注意:sysctl调了之后,应用层也要同步调。Nginx的listen指令、Redis的tcp-backlog、Java的ServerSocket构造函数,都有自己的backlog参数,最终取的是sysctl值和应用层值两者中的较小值。系统调大而应用没调,等于白改。

一次完整的参数配置

把下面这些写进/etc/sysctl.conf,然后sysctl -p生效:

text

复制代码
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65000

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 10000

调完后用iperf3跑个测试对比前后数据,能看到明显变化。跨境链路上,这几个参数带来的提升比其他花哨的优化手段都实在。

相关推荐
say_fall1 天前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
流浪0012 天前
计算机网络篇22:网络层——公网的三级地址划分与逐跳转发,从私网出口替换到 IP 分片组装
tcp/ip·计算机网络·路由器·公网搭建·报文分篇
Java成神之路-2 天前
TCP Socket 与 UDP Socket
tcp/ip·计算机网络·udp
|_⊙3 天前
网络层协议 IP
服务器·网络·tcp/ip
沫璃染墨3 天前
从零入门计算机网络系列(十五):TCP可靠传输机制详解——从序号与确认应答到乱序处理
服务器·网络·c++·tcp/ip·tcp
流浪0013 天前
计算机网络篇20:网络层——IP 协议的定位与 IPv4 报头字段,从 20 字节首部到 TTL 防环
tcp/ip·计算机网络·ttl·网络层协议·ip报头
zhengfei6113 天前
CVE-2026-98432:Linux 内核 TCP 释放后重用漏洞,CVSS 9.8 但补丁覆盖极不均衡
linux·运维·tcp/ip
沫璃染墨4 天前
从零入门计算机网络系列(十四):TCP报文与字节流本质——从数据封装到报文边界
linux·服务器·网络·网络协议·tcp/ip·tcp
流浪0015 天前
计算机网络篇17:传输层——TCP 超时重传、三次握手与四次挥手,TIME_WAIT 为什么要等 2MSL
网络协议·tcp/ip·计算机网络·三次握手·四次挥手·超时重传
流浪0015 天前
计算机网络篇16:传输层——TCP 报头属性字段:16 位窗口大小撑起流量控制,六个标志位标识报文类型
网络协议·tcp/ip·计算机网络·urg紧急指针·tcp报头