实战:编译集成 LFN 补丁的 BBRv3 内核
如果你还不了解为什么需要这个补丁,请先阅读前一篇文章:为 BBRv3 打上 LFN 补丁:在高延迟跨境链路上突破 2% 丢包限制。
在上篇文章中,我们讨论了 BBRv3 在跨境、卫星等高延迟链路上的 2% 丢包限制问题,并给出了一个安全的条件放宽补丁。今天,我们将把这个补丁真正编译进内核。
环境准备
1. 安装依赖
sudo apt update
sudo apt install -y build-essential libncurses-dev bison flex libssl-dev libelf-dev bc wget git clang lld2. 获取内核源码
LFN 补丁 基于 google/bbr - Tree v3 内核版本 6.13.7 的 tcp_bbr.c。
git clone -o google-bbr -b v3 https://github.com/google/bbr.git
cd bbr/应用 BBRv3 LFN 补丁
下载补丁
wget -O bbr-lfn.patch \
https://github.com/Ardentwheel/Linux-BBRv3-LFN-Patch/raw/main/patch/0001-tcp_bbr-add-optional-LFN-loss-tolerance-via-sysctl-d.patch应用补丁
git apply bbr-lfn.patch如果提示成功,没有任何报错,说明补丁已正确打入 net/ipv4/ 目录。
内核配置(最关键的一步)
1. 复用现有配置
如果你是升级内核,最好复用当前系统的配置:
# 拷贝当前系统配置
cp /boot/config-$(uname -r) .config2. 自动补齐新配置
由于补丁新增了 sysctl 参数,我们需要补齐配置项。强烈推荐使用 olddefconfig,避免交互式菜单:
make LLVM=1 olddefconfig参数解释:
LLVM=1:使用 Clang 编译。
💡 避坑指南:如果你之前误用了make prepare并卡在REGULATOR_*之类菜单,直接按 ESC退出,然后用上面的命令即可。
3. 开启 BBRv3
./scripts/config --enable CONFIG_TCP_CONG_BBR
./scripts/config --set-str CONFIG_DEFAULT_TCP_CONG "bbr"4. 开启 FQ / FQ_CODEL / CAKE
./scripts/config --enable CONFIG_NET_SCH_FQ
./scripts/config --enable CONFIG_NET_SCH_FQ_CODEL
./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 文件:
# 清理 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.symvers2. 更新配置
虽然本次补丁主要是代码改动,但建议执行:
make LLVM=1 olddefconfig3. 重新生成构建脚本
make scripts编译参数
为了获得最佳性能,我们使用 LLVM/Clang 并针对你的 CPU 架构优化:
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 文件会在上层目录:
cd ..
sudo dpkg -i linux-image-*.deb
sudo dpkg -i linux-headers-*.deb2. 重启
sudo reboot验证补丁生效
重启后,登录服务器,执行以下检查:
1. 确认内核版本
uname -r
# 应显示 6.13.x2. 确认 sysctl 参数存在
这是最直接的验证方式:
sysctl net.ipv4.tcp_bbr_lfn_loss_thresh_pct
# 输出: 0
sysctl net.ipv4.tcp_bbr_lfn_min_rtt_fresh_ms
# 输出: 50003. 启用 LFN 优化(跨境链路示例)
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 --system4. 性能测试
# 确认使用 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。 解决:
rm -f net/ipv4/sysctl_net_ipv4.o # 再次 make...
BBR 模块加载失败?
- 原因:
Module.symvers不一致。 解决:
rm -f Module.symvers make modules_prepare # 再次 make...
性能无变化?
- 原因:补丁未生效,或链路不是“物理丢包”。
- 解决:用
ss -ti观察bbr的inflight_hi是否被冻结。
AQM 搭配
队列规则建议 pct备注fq5–7最推荐,pacing 完美fq_codel 5–7启用 1.15×BDP roof 保护cake4–6延迟优先,勿过度激进若需要更为详尽的信息,请参阅 AQM 兼容性 和 AQM 搭配建议
总结
至此,你已经拥有了一个既保留了 BBRv3 的公平性、AQM 友好性,又能适应跨境高丢包环境的定制内核。
回顾核心逻辑:
默认关闭(0)→ 按需开启(5–7)→ 仅在无队列堆积且 inflight 安全时生效。
如果在编译过程中遇到问题,欢迎在评论区留言。
Happy hacking! 🚀
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »