甲骨云ARM服务器编译BBRv3内核

2026-06-22T20:46:00

作为目前最强悍的拥塞控制算法,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:

sudo apt update
sudo apt install -y build-essential libncurses-dev bison flex \
     libssl-dev libelf-dev bc rsync kmod cpio git \
     clang lld llvm make
💡 命令以 Debian/Ubuntu 系为准(甲骨文 Ubuntu 20.04/22.04/24.04 镜像最常见)。

2. 获取 BBRv3 源码

google/bbr 仓库的 v3 分支:

git clone -b v3 https://github.com/google/bbr.git --depth=1
cd bbr

内核配置

1. 复用当前系统配置

cp /boot/config-$(uname -r) .config

2. 清掉签名密钥(必做)

甲骨文官方镜像的 .config 里带了 CONFIG_SYSTEM_TRUSTED_KEYS,本地没私钥,不清下一步必炸:

scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
scripts/config --set-str SYSTEM_REVOCATION_KEYS ""
scripts/config --disable CONFIG_MODULE_SIG
scripts/config --disable CONFIG_MODULE_SIG_ALL

3. 开启 BBRv3 + FQ / CAKE

./scripts/config --enable CONFIG_TCP_CONG_BBR
./scripts/config --set-str CONFIG_DEFAULT_TCP_CONG "bbr"
./scripts/config --enable CONFIG_NET_SCH_FQ
./scripts/config --enable CONFIG_NET_SCH_CAKE
./scripts/config --set-str CONFIG_DEFAULT_NET_SCH "fq"

4. 进阶内核优化

关闭调试,优化符号与体积

# 关 debug 符号,deb 包能从 ~800 MB 缩到 ~200 MB
./scripts/config --disable CONFIG_DEBUG_INFO
./scripts/config --disable CONFIG_DEBUG_INFO_MISC
./scripts/config --disable CONFIG_DEBUG_INFO_DWARF4
./scripts/config --disable CONFIG_DEBUG_INFO_DWARF5

调整预占模型与时钟频率

# 服务器高吞吐取向
./scripts/config --enable  CONFIG_PREEMPT_NONE
./scripts/config --disable CONFIG_PREEMPT_VOLUNTARY
./scripts/config --disable CONFIG_PREEMPT
./scripts/config --disable CONFIG_HZ_1000
./scripts/config --enable  CONFIG_HZ_250

开启性能导向编译与ThinLTO

# 性能编译 + ThinLTO(依赖上面装好的 clang/lld)
./scripts/config --enable CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
./scripts/config --enable CONFIG_LTO_CLANG_THIN
💡 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. 自动补齐新配置项

make LLVM=1 olddefconfig

olddefconfig 会把新出现的 Kconfig 项按默认值填好,避免你手点 menuconfig。

编译

两条路径,选一条就行(别编两次)

  • 路径 A:GCC 默认(稳,慢一点,无 ThinLTO)

    make -j$(nproc) bindeb-pkg
  • 路径 B:Clang + ThinLTO + Neoverse-N1 指令(推荐,这篇主打的就是这个)

    make -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 核的话翻倍,去喝杯咖啡。

安装与重启

cd ..
sudo dpkg -i linux-image-*.deb linux-headers-*.deb
sudo reboot

甲骨文 A1 的 UEFI GRUB 一般会自动把新内核挂第 0 项,万一不是,进_serial console_ 选 Advanced → 旧内核兜底还在(这就是 deb 比 make install 稳的地方)。

验证 BBRv3 真的生效

重启后登录,别只看 uname -r,要三层都过才算:

# 1. 内核版本
uname -r

# 2. 拥塞控制
sysctl net.ipv4.tcp_congestion_control
# 应为 bbr

# 3. 模块是否在
lsmod | grep bbr
# 或者
modprobe tcp_bbr   # 不报错的就算在

# 4. 实际连接看一眼(开个 ssh 另一个窗口)
ss -ti
# 最后一列应有 bbr 字样 + pacing_rate / cwnd 那些字段
如果 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:

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /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 🚀

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »