作为目前最强悍的拥塞控制算法,Google BBRv3 在低延迟+高吞吐之间找的平衡比 v1/v2 更稳。但主流发行版(哪怕 Oracle Linux UEK)都没把 BBRv3 合入,甲骨文 ARM 实例(Ampere A1,Neoverse N1)想吃到,只能自己编。
这篇的目标是:编出一个干净、轻量、带 BBRv3 + FQ/CAKE、并在 Neoverse N1 上走 ThinLTO + 架构指令的 Debian 包。
环境准备
1. 编译依赖
甲骨文 ARM 默认源里的包名和 x86 一致,但 clang/lld 要用上,因为后面要走 ThinLTO:
1 | sudo apt update |
💡 命令以 Debian/Ubuntu 系为准(甲骨文 Ubuntu 20.04/22.04/24.04 镜像最常见)。
2. 获取 BBRv3 源码
google/bbr 仓库的 v3 分支:
1 | git clone -b v3 https://github.com/google/bbr.git --depth=1 |
内核配置
1. 复用当前系统配置
1 | cp /boot/config-$(uname -r) .config |
2. 清掉签名密钥(必做)
甲骨文官方镜像的 .config 里带了 CONFIG_SYSTEM_TRUSTED_KEYS,本地没私钥,不清下一步必炸:
1 | scripts/config --set-str SYSTEM_TRUSTED_KEYS "" |
3. 开启 BBRv3 + FQ / CAKE
1 | ./scripts/config --enable CONFIG_TCP_CONG_BBR |
4. 进阶内核优化
关闭调试,优化符号与体积
1 | # 关 debug 符号,deb 包能从 ~800 MB 缩到 ~200 MB |
调整预占模型与时钟频率
1 | # 服务器高吞吐取向 |
开启性能导向编译与ThinLTO
1 | # 性能编译 + ThinLTO(依赖上面装好的 clang/lld) |
💡 CONFIG_LTO_CLANG_THIN 在 ARM 上收益比 x86 还明显——N1 是宽发射顺序核,LTO 后 ipv4/tcp 那些热路径函数内联和调度会更贴合。但首次编会慢 30–50%,心理准备。跨境链路 LFN 补丁
如果你链路是跨境 / 卫星 / 高 RTT 那种(RTT > 100 ms、丢包 3–7%),光 BBRv3 还不够——它默认在 2% 以上就会把 inflight 砍得很怂,下一篇 实战:编译集成 LFN 补丁的 BBRv3 内核 就是接着这个内核继续打补丁的。(原理篇见 为 BBRv3 打上 LFN 补丁:在高延迟跨境链路上突破 2% 丢包限制)
5. 自动补齐新配置项
1 | make LLVM=1 olddefconfig |
olddefconfig 会把新出现的 Kconfig 项按默认值填好,避免你手点 menuconfig。
编译
两条路径,选一条就行(别编两次)
路径 A:GCC 默认(稳,慢一点,无 ThinLTO)
1make -j$(nproc) bindeb-pkg路径 B:Clang + ThinLTO + Neoverse-N1 指令(推荐,这篇主打的就是这个)
1
2
3make -j$(nproc) LLVM=1 LLVM_IAS=1 \
KCFLAGS="-mcpu=neoverse-n1 -O3" \
bindeb-pkg REBUILD_DEBUG=0
参数解释:
LLVM=1:用 clang 替代 gcc 当 cc。LLVM_IAS=1:用 clang 内置汇编器,省掉交叉汇编那套麻烦。-mcpu=neoverse-n1:把 N1 的 LSE、CRC、RDMA 这些指令打开,甲骨文 A1 就是这块 U。-O3:比内核默认的 -O2 更激进,TCP 路径上小函数基本全 inline。bindeb-pkg:直接出linux-image-*.deb+linux-headers-*.deb,甲骨文这种云机最方便,装完 grub 自动更新。REBUILD_DEBUG=0:deb 里不带 dbg 包,省空间。
☕ 甲骨文 ARM 4 核编 ThinLTO 大概 25–40 分钟,2 核的话翻倍,去喝杯咖啡。
安装与重启
1 | cd .. |
甲骨文 A1 的 UEFI GRUB 一般会自动把新内核挂第 0 项,万一不是,进_serial console_ 选 Advanced → 旧内核兜底还在(这就是 deb 比 make install 稳的地方)。
验证 BBRv3 真的生效
重启后登录,别只看 uname -r,要三层都过才算:
1 | # 1. 内核版本 |
如果sysctl net.ipv4.tcp_congestion_control返回的还是 cubic,手动sudo sysctl -w net.ipv4.tcp_congestion_control=bbr写进/etc/sysctl.d/99-bbr.conf固化。
故障排查(甲骨云 ARM 容易踩的几处)
① 编译时报 signature/key 相关错误
→ 忘了清 SYSTEM_TRUSTED_KEYS,回去重跑那两步再 make olddefconfig。
② ThinLTO 编到一半 OOM kill
→ 甲骨文 2 核 12 GB 这种规格开 -j$(nproc) 容易炸,-j2 或加 swap:
1 | sudo fallocate -l 4G /swapfile |
AQM / 队列规则搭配建议
| 队列规则 | 与 BBRv3 搭配 | 备注 |
|---|---|---|
| fq | ✅ 最推荐 | pacing 原生,BBR 作者内建测的就是这个 |
| fq_codel | ✅ 可用 | 有 CoDel 降延迟,但 pacing 让给 BBR 自己 |
| cake | ❌ 不推荐 | BBRv3 与 cake 的 pacing 叠加,吞吐下降 |
| pfifo_fast | ❌ 不推荐 | 无 pacing,BBR 优势发挥不全 |
甲骨文 ARM 单网口一般跑 fq 足够。
若需要更为详尽的信息,请参阅 AQM 搭配建议
总结
到这一步你手上有一个:
- ✅ BBRv3(不是老 v1)
- ✅ FQ / CAKE 可选
- ✅ Clang ThinLTO +
-mcpu=neoverse-n1 -O3 - ✅ 关调试、服务器抢占、250 Hz,走的是高吞吐取向
- ✅ deb 包,回滚
dpkg -r就能降
到这一步,你已经拥有一个在 Neoverse N1 上跑得飞起的 BBRv3 内核;如果你的链路并不干净,那么下一篇 实战:编译集成 LFN 补丁的 BBRv3 内核,才是真正拉开差距的地方。
Happy hacking 🚀