香港CN2服务器TCP拥塞控制踩坑记:一次内核参数优化挽救30%性能

事故背景

上周五晚高峰,香港CN2节点上一台承载跨境API业务的服务器(轻云互联香港E5-2680 v4实例)突然出现严重响应超时。监控显示TCP重传率飙升至12%,平均延迟从35ms跳到220ms,丢包率一度突破5%。业务方反馈东南亚用户无法完成下单。

第一反应:网卡还是内核?

登录后先排除物理层:ethtool -S eth0看到rx_crc_errors极少,mii-tool eth0显示全双工千兆正常。手边没有抓包环境,直接看内核网络栈统计:

# cat /proc/net/snmp | grep Tcp
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs RetransTimeouts
Tcp: 1 200 120000 -1 3452 2331 89 12 451 1248743 1154321 138754 345

关键指标RetransSegs占比异常高(138754/1154321 ≈ 12%),RetransTimeouts高达345次。不是硬件问题,是内核TCP栈瓶颈。

根因定位:BBR与默认缓存冲突

这台机器跑了sysctl net.ipv4.tcp_congestion_control=bbr,但net.core.rmem_maxnet.core.wmem_max还是默认值(212992 bytes)。香港CN2线路虽优,但跨境长肥网络(BDP大)需要更大的套接字缓冲才能发挥BBR优势。检查实际使用:

# ss -ti | head -20 
State      Recv-Q Send-Q               Local Address:Port                Peer Address:Port
ESTAB      0      37864                 10.0.0.1:443                   185.xx.xx.xx:53218
   congestion_alg bbr rcv_space:30480 rcv_ssthresh:43690

rcv_space才30KB,说明自动缓冲调整受限。同时tcp_notsent_lowat默认-1导致应用层写入时经常被压抑。

手术刀式调整:五组关键参数

直接修改/etc/sysctl.d/99-hkcn2-optimize.conf

# 针对香港CN2 100ms RTT、100Mbps带宽的计算BDP=100ms*100Mbps/8≈1.25MB
net.core.rmem_max = 4194304
net.core.wmem_max = 4194304
net.ipv4.tcp_rmem = 4096 131072 4194304
net.ipv4.tcp_wmem = 4096 65536 4194304

# 启用BBR + fq(公平队列)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# 减少丢失窗口,加快恢复
net.ipv4.tcp_slow_start_after_idle = 0

# 降低应用层延迟(发送阈值)
net.ipv4.tcp_notsent_lowat = 131072

# 增大连接队列,防止SYN洪水
net.core.somaxconn = 65536
net.ipv4.tcp_max_syn_backlog = 65536

执行sysctl -p /etc/sysctl.d/99-hkcn2-optimize.conf后立即生效。注意BBR对缓冲区敏感,过大反而增加延迟,实际动态调整时会自动适配。

验证与血泪教训

15分钟后重传率降至0.3%,延迟稳定在38ms,丢包率0.02%。对比调整前后的ss -ti

# 调整后
ESTAB      0      0                    10.0.0.1:443                   185.xx.xx.xx:53218
   congestion_alg bbr rcv_space:1048576 rcv_ssthresh:2097152

rcv_space增长到1MB,刚好匹配BDP。这次事故的核心教训:香港CN2服务器即使线路优秀,如果内核TCP缓冲参数和拥塞控制算法不匹配,带宽和延迟优势会被彻底抵消。轻云互联的香港节点物理资源充足,但用户需根据业务特征手动调整内核参数才能榨干性能。

后续监控建议

  • 定期检查/proc/net/snmp中的RetransSegs/OutSegs比值
  • tc -s qdisc show dev eth0确保fq队列正常工作
  • 对长连接额外调整net.ipv4.tcp_keepalive_time=300防止NAT超时

这次排查没有花哨工具,纯靠内核计数器 + 对BDP的理解。香港CN2不是银弹,内核参数调不对一样崩。