首页/系统/Linux 内核与性能调优速查/按连接选择拥塞控制
网络栈调优98 条

按连接选择拥塞控制

在 socket 级选择拥塞控制算法, 相比全局切换影响面更小; 先用系统列表确认算法可用。

按连接选算法

Linux 的拥塞控制算法既可以通过系统参数全局切换,也可以在单个套接字上指定。连接级指定只影响这一条连接,便于在同一台机器上做灰度对比,验证某算法在真实业务里的表现。设置前必须先确认目标算法在当前内核可用,否则设置调用会直接失败。

基本信息

适用平台Linux
选项名称TCP_CONGESTION,取值为算法名字符串
常用算法内核默认多为 cubic,低延迟链路常评估 bbr
查看列表net.ipv4.tcp_available_congestion_control
查看当前net.ipv4.tcp_congestion_control
权限要求普通用户可设置;加载模块需要 root

典型使用场景

  • 跨地域长链路吞吐上不去,评估更换算法是否带来改善。
  • 只对某类业务连接做灰度验证,避免全局切换影响整机流量。
  • 排查实际生效的算法与预期不一致的问题。
  • 云主机内核差异导致算法可用性不同,需要先列清单再改代码。
  • 回退验证:按连接切换算法,快速对比两套策略的指标。

C 用例

C 用例
/* 长度为算法名长度,不含字符串结束符 */
if (setsockopt(fd, IPPROTO_TCP, TCP_CONGESTION, "bbr", 3) < 0) {
    perror("setsockopt TCP_CONGESTION");   /* 算法不可用时在此报错 */
}

确认可用与生效

确认可用与生效
sysctl net.ipv4.tcp_available_congestion_control   # 本机可用算法清单
sysctl net.ipv4.tcp_congestion_control             # 全局默认算法
modprobe tcp_bbr                                   # 需要的算法未在清单中时先加载模块
ss -tin state established 'sport = :443' | head    # 连接信息里可对照算法相关字段
nstat -az TcpRetransSegs TcpOutSegs                # 用重传率对比切换前后的表现

算法选择参考

链路特征倾向选择理由
常规公网、丢包不高保持内核默认默认算法经过广泛验证
高带宽长延迟、存在一定丢包评估基于带宽与延迟估计的算法对丢包更宽容
混合业务单机共存按连接设置避免影响其它流量
算法名大小写敏感且随内核版本变化,写代码前用清单输出核对名称,不要凭记忆写字符串。
切换拥塞控制会改变传输行为,属于影响面较大的变更;建议先按连接灰度并用重传率、吞吐与延迟三项指标对比,再考虑扩大范围。

易错点

  • 算法模块未加载导致设置失败:上线即报参数错误,改动前先核对可用清单并加载模块。
  • 算法名写错:名称大小写敏感,错误名称会被直接拒绝,而不是自动回退到默认算法。
  • 直接全局切换而无灰度:影响整机所有连接,回退需要再次变更,风险集中且难以定位。
  • 把新算法当成通用提速手段:在对端限速或链路质量差的场景收益有限,必须用真实流量实测。
  • 忽略内核与发行版差异:同一份代码在不同内核上可用算法集合不同,需要运行时判断而不是硬编码。

数据来源与参考

  • man 7 tcp
  • Linux Documentation/networking/ip-sysctl.txt
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌