如果你还不了解为什么需要这个补丁,请先阅读前一篇文章:为 BBRv3 打上 LFN 补丁:在高延迟跨境链路上突破 2% 丢包限制。
在上篇文章中,我们讨论了 BBRv3 在跨境、卫星等高延迟链路上的 2% 丢包限制问题,并给出了一个安全的条件放宽补丁。今天,我们将把这个补丁真正编译进内核。
环境准备
1. 安装依赖
1 | sudo apt update |
2. 获取内核源码
我们使用 google/bbr - Tree v3 内核版本 6.13.7,因为 LFN 补丁根据这个版本制作。
1 | git clone -o google-bbr -b v3 https://github.com/google/bbr.git |
应用 BBRv3 LFN 补丁
下载补丁
应用补丁
1 | git apply 0001-net-ipv4-add-BBR-LFN-sysctl-parameters.patch |
如果提示成功,没有任何报错,说明补丁已正确打入 net/ipv4/ 目录。
内核配置(最关键的一步)
1. 复用现有配置
如果你是升级内核,最好复用当前系统的配置:
1 | # 拷贝当前系统配置 |
2. 自动补齐新配置
由于补丁新增了 sysctl 参数,我们需要补齐配置项。强烈推荐使用 olddefconfig,避免交互式菜单:
1 | make LLVM=1 olddefconfig |
参数解释:
LLVM=1:使用 Clang 编译。
💡 避坑指南:如果你之前误用了make prepare并卡在REGULATOR_*之类菜单,直接按 ESC退出,然后用上面的命令即可。
3. 开启 BBRv3
1 | ./scripts/config --enable CONFIG_TCP_CONG_BBR |
4. 开启 FQ / FQ_CODEL / CAKE
1 | ./scripts/config --enable CONFIG_NET_SCH_FQ |
5. 进阶内核优化
实际运行还应关闭调试,优化符号、文件体积,参阅:进阶内核优化
开始编译
若你是增量编译(全新编译跳过)
千万不要直接 make ! 内核构建系统不会自动识别所有依赖变化,直接编译可能导致补丁未生效。
1. 清理受影响的编译产物
由于补丁修改了 内核核心代码 (sysctl_net_ipv4.c) 和 模块代码 (tcp_bbr.c),必须清理对应的 .o 文件:
1 | # 清理 sysctl 核心代码(必须) |
2. 更新配置
虽然本次补丁主要是代码改动,但建议执行:
1 | make LLVM=1 olddefconfig |
3. 重新生成构建脚本
1 | make scripts |
编译参数
为了获得最佳性能,我们使用 LLVM/Clang 并针对你的 CPU 架构优化:
1 | make -j$(nproc) LLVM=1 LLVM_IAS=1 \ |
参数解释:
-j$(nproc):根据系统核心数量进行多核并行编译。LLVM=1 LLVM_IAS=1:使用 Clang 编译。-mcpu=native:自动检核心架构,并应用相关架构优化。bindeb-pkg:生成 Debian 安装包(.deb),方便安装和回滚。REBUILD_DEBUG=0:不包含调试符号,减小体积。
喝杯咖啡 ☕
编译时长取决于你的 CPU 核心数,通常需要 10–30 分钟。
安装与重启
1. 安装新内核
编译完成后,.deb 文件会在上层目录:
1 | cd .. |
2. 重启
1 | sudo reboot |
验证补丁生效
重启后,登录服务器,执行以下检查:
1. 确认内核版本
1 | uname -r |
2. 确认 sysctl 参数存在
这是最直接的验证方式:
1 | sysctl net.ipv4.tcp_bbr_lfn_loss_thresh_pct |
3. 启用 LFN 优化(跨境链路示例)
1 | sudo tee /etc/sysctl.d/99-bbr-lfn.conf << EOF |
4. 性能测试
1 | # 确认使用 BBR |
你应该能看到,在 3–5% 丢包的环境下,吞吐量不再被死死限制在低位。
故障排查
sysctl 参数不存在?
- 原因:
sysctl_net_ipv4.c未重新编译进 vmlinux。 解决:
1
2rm -f net/ipv4/sysctl_net_ipv4.o
# 再次 make...
BBR 模块加载失败?
- 原因:
Module.symvers不一致。 解决:
1
2
3rm -f Module.symvers
make modules_prepare
# 再次 make...
性能无变化?
- 原因:补丁未生效,或链路不是“物理丢包”。
- 解决:用
ss -ti观察bbr的inflight_hi是否被冻结。
AQM 兼容性提示
在启用 pct=7时,请确保你的队列规则是安全的:
| 队列规则 | 建议 pct | 备注 |
|---|---|---|
| fq | 5–10 | 最推荐,pacing 完美 |
| fq_codel | 5–7 | 启用 1.15×BDP roof 保护 |
| cake | 4–6 | 延迟优先,勿过度激进 |
总结
至此,你已经拥有了一个既保留了 BBRv3 的公平性、AQM 友好性,又能适应跨境高丢包环境的定制内核。
回顾核心逻辑:
默认关闭(0)→ 按需开启(5–7)→ 仅在无队列堆积且 inflight 安全时生效。
如果在编译过程中遇到问题,欢迎在评论区留言。
Happy hacking! 🚀