拥塞算法清单与启用
tcp_available_congestion_control 与 tcp_allowed_congestion_control 是两个只读清单:前者列出内核当前支持(已编译或已加载模块)的算法,后者列出允许应用通过 setsockopt 自行切换的算法。想用 BBR 必须先在 available 里看到它,通常意味着需要加载 tcp_bbr 模块;默认算法由 net.ipv4.tcp_congestion_control 指定,只作用于新建连接。
基本信息
| 可用清单 | net.ipv4.tcp_available_congestion_control |
|---|---|
| 允许清单 | net.ipv4.tcp_allowed_congestion_control |
| 默认算法 | net.ipv4.tcp_congestion_control |
| 常见值 | cubic、reno,加载模块后出现 bbr |
| 权限 | 查看无需权限,切换需要 root 或容器内相应能力 |
典型使用场景
- 启用 BBR 前确认模块是否已经加载
- 应用 setsockopt(TCP_CONGESTION) 失败时确认 allowed 是否包含目标算法
- 网络性能复盘:确认线上连接实际使用的算法与预期一致
- 同机多业务需要不同算法时评估可行性
- 内核升级后核对算法清单是否发生变化
查看与切换
查看与切换
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_allowed_congestion_control
sysctl net.ipv4.tcp_congestion_control
modprobe tcp_bbr # 先加载模块,再回看 available 清单
sysctl -w net.ipv4.tcp_congestion_control=bbr # 设为新连接的默认算法
ss -tin state established | head -20 # 看连接上的算法标记(cubic/bbr)三个参数的分工
| 参数 | 作用 | 注意 |
|---|---|---|
| available | 内核当前可用的算法清单 | 模块加载后才会出现新算法 |
| allowed | 允许应用内切换的算法集合 | 不在集合内时 setsockopt 会被拒绝 |
| tcp_congestion_control | 新建连接的默认算法 | 已建立的连接保持原算法不变 |
清单里没有目标算法时,先解决模块加载或内核版本问题;反复写 tcp_congestion_control 只会报 No such file or directory。
改默认算法只影响之后新建的连接,长连接业务需要应用重建连接或滚动重启才会生效。
确认算法真的在用
- 用 ss -i 或 ss -tin 看单条连接的算法标记与 rtt、cwnd、retrans 指标
- 加载模块后立即回看 available 清单,确认目标算法已出现再改默认值
- 在容器内确认宿主内核是否已加载该模块,容器自身无法加载宿主模块
常见算法与适用场景
- cubic:多数发行版的默认算法,通用场景下表现稳定
- bbr:基于带宽与延迟估计,在高丢包或长肥管道上常优于丢包驱动的算法
- reno:最基础的算法,适合作为兼容性与排障时的对照基线