半夜接到报警,台湾节点的API接口超时率飙到15%。登上去一看,Ping值稳稳的35ms,但吞吐量掉到了几百K。这就是典型的跨海链路没填满,默认内核参数在海峡光缆面前就是个摆设。
做台湾服务器TCP调优,别去搞那些虚头巴脑的外部代理。直接进SSH改内核,把BDP (带宽延迟积)撑起来,这比花大价钱买国际专线管用得多。
扒开协议栈看丢包元凶
Linux默认的Cubic算法对丢包极度敏感。海峡链路只要出现0.1%的偶发抖动,Cubic就会以为网络拥塞,直接把发送窗口砍掉一半。这内核参数不改,你带宽买再大也白搭。
- 把 net.ipv4.tcp_rmem 的最大值拉高到16MB,强行撑开接收窗口。
- 开启 tcp_window_scaling,不然跨海高延迟下窗口根本扩不出去。
- 抛弃Cubic,换上专门针对高延迟链路写的 Hybla 算法,丢包时不降速。
三种拥塞算法实测对照
| 算法类型 | RTT 40ms / 丢包1% | 吞吐量表现 | 重传率 |
|---|---|---|---|
| Cubic (默认) | 疯狂降速 | 跌至 12 Mbps | 8.5% |
| BBR (谷歌) | 主动避让 | 卡在 45 Mbps | 3.2% |
| Hybla (魔改) | 无视抖动 | 飙升至 98 Mbps | 1.1% |
(别问我为什么不用BBR,海峡链路用BBR容易饿死,实测Hybla最抗造)。
这几类业务千万别瞎改
如果你只是跑纯内网互通,或者只做几KB的静态小文件分发,别瞎折腾内核。默认参数足够你用了,强行拉高缓冲区反而会导致内存OOM。这套改法只针对大文件传输、长连接API和高频数据库同步场景。
sysctl -w net.ipv4.tcp_congestion_control=hybla
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216'
sysctl -w net.ipv4.tcp_window_scaling=1作者简介:写了10年网络协议栈的秃头码农,专治各种跨海链路不服。
别等晚高峰业务挂了才想起来看内核,赶紧登进SSH把参数敲进去。