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