如果你还不了解为什么需要这个补丁,请先阅读前一篇文章:为 BBRv3 打上 LFN 补丁:在高延迟跨境链路上突破 2% 丢包限制

在上篇文章中,我们讨论了 BBRv3 在跨境、卫星等高延迟链路上的 2% 丢包限制问题,并给出了一个安全的条件放宽补丁。今天,我们将把这个补丁真正编译进内核。

环境准备

1. 安装依赖

1
2
sudo apt update
sudo apt install -y build-essential libncurses-dev bison flex libssl-dev libelf-dev bc git clang lld

2. 获取内核源码

我们使用 google/bbr - Tree v3 内核版本 6.13.7,因为 LFN 补丁根据这个版本制作。

1
2
git clone -o google-bbr -b v3  https://github.com/google/bbr.git
cd bbr/

应用 BBRv3 LFN 补丁

下载补丁

应用补丁

1
git apply 0001-net-ipv4-add-BBR-LFN-sysctl-parameters.patch

如果提示成功,没有任何报错,说明补丁已正确打入 net/ipv4/ 目录。

内核配置(最关键的一步)

1. 复用现有配置

如果你是升级内核,最好复用当前系统的配置:

1
2
# 拷贝当前系统配置
cp /boot/config-$(uname -r) .config

2. 自动补齐新配置

由于补丁新增了 sysctl 参数,我们需要补齐配置项。强烈推荐使用 olddefconfig,避免交互式菜单:

1
make LLVM=1 olddefconfig

参数解释:

  • LLVM=1:使用 Clang 编译。
💡 避坑指南:如果你之前误用了 make prepare 并卡在 REGULATOR_* 之类菜单,直接按 ESC退出,然后用上面的命令即可。

3. 开启 BBRv3

1
2
./scripts/config --enable CONFIG_TCP_CONG_BBR
./scripts/config --set-str CONFIG_DEFAULT_TCP_CONG "bbr"

4. 开启 FQ / FQ_CODEL / CAKE

1
2
3
4
./scripts/config --enable CONFIG_NET_SCH_FQ
./scripts/config --enable CONFIG_NET_SCH_FQ_CODEL=y
./scripts/config --enable CONFIG_NET_SCH_CAKE
./scripts/config --set-str CONFIG_DEFAULT_NET_SCH "fq"

5. 进阶内核优化

实际运行还应关闭调试,优化符号、文件体积,参阅:进阶内核优化

开始编译

若你是增量编译(全新编译跳过)

千万不要直接 make !​ 内核构建系统不会自动识别所有依赖变化,直接编译可能导致补丁未生效。

1. 清理受影响的编译产物

由于补丁修改了 内核核心代码​ (sysctl_net_ipv4.c) 和 模块代码​ (tcp_bbr.c),必须清理对应的 .o 文件:

1
2
3
4
5
6
7
8
# 清理 sysctl 核心代码(必须)
rm -f net/ipv4/sysctl_net_ipv4.o

# 清理 BBR 模块(必须)
rm -f net/ipv4/tcp_bbr.o net/ipv4/tcp_bbr.mod*

# 清理模块依赖关系(推荐)
rm -f Module.symvers

2. 更新配置

虽然本次补丁主要是代码改动,但建议执行:

1
make LLVM=1 olddefconfig

3. 重新生成构建脚本

1
make scripts

编译参数

为了获得最佳性能,我们使用 LLVM/Clang 并针对你的 CPU 架构优化:

1
2
3
make -j$(nproc) LLVM=1 LLVM_IAS=1 \
KCFLAGS="-mcpu=native" \
bindeb-pkg REBUILD_DEBUG=0

参数解释:

  • -j$(nproc):根据系统核心数量进行多核并行编译。
  • LLVM=1 LLVM_IAS=1:使用 Clang 编译。
  • -mcpu=native:自动检核心架构,并应用相关架构优化。
  • bindeb-pkg:生成 Debian 安装包(.deb),方便安装和回滚。
  • REBUILD_DEBUG=0:不包含调试符号,减小体积。

喝杯咖啡 ☕

编译时长取决于你的 CPU 核心数,通常需要 10–30 分钟。

安装与重启

1. 安装新内核

编译完成后,.deb 文件会在上层目录:

1
2
3
cd ..
sudo dpkg -i linux-image-*.deb
sudo dpkg -i linux-headers-*.deb

2. 重启

1
sudo reboot

验证补丁生效

重启后,登录服务器,执行以下检查:

1. 确认内核版本

1
2
uname -r
# 应显示 6.13.x

2. 确认 sysctl 参数存在

这是最直接的验证方式:

1
2
3
4
5
sysctl net.ipv4.tcp_bbr_lfn_loss_thresh_pct
# 输出: 0

sysctl net.ipv4.tcp_bbr_lfn_min_rtt_fresh_ms
# 输出: 5000

3. 启用 LFN 优化(跨境链路示例)

1
2
3
4
5
6
7
sudo tee /etc/sysctl.d/99-bbr-lfn.conf << EOF
# BBR LFN: allow up to 7% loss in PROBE_BW if RTT<1.2x min_rtt & inflight<=1.15xBDP
net.ipv4.tcp_bbr_lfn_loss_thresh_pct = 7
net.ipv4.tcp_bbr_lfn_min_rtt_fresh_ms = 5000
EOF

sudo sysctl --system

4. 性能测试

1
2
3
4
5
6
7
8
# 确认使用 BBR
sysctl net.ipv4.tcp_congestion_control
# 应为 bbr

# iperf3 测试
# 服务器 iperf3 -s
# 边缘节点 / 客户端 :
iperf3 -c your_server_ip -t 60 -i 1

你应该能看到,在 3–5% 丢包的环境下,吞吐量不再被死死限制在低位。

故障排查

sysctl 参数不存在?

  • 原因sysctl_net_ipv4.c 未重新编译进 vmlinux。
  • 解决

    1
    2
    rm -f net/ipv4/sysctl_net_ipv4.o
    # 再次 make...

BBR 模块加载失败?

  • 原因Module.symvers不一致。
  • 解决

    1
    2
    3
    rm -f Module.symvers
    make modules_prepare
    # 再次 make...

性能无变化?

  • 原因:补丁未生效,或链路不是“物理丢包”。
  • 解决:用 ss -ti 观察 bbrinflight_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! 🚀