Linux 内核网络调优:让 BBR 与大缓冲榨干带宽

这台服务器的内核被我换成了 XanMod,配合 BBR 和调大的 UDP 缓冲,跨地域传输速度有质的飞跃。把调优参数记录一下,方便以后查阅。

TCP 拥塞控制:BBR

默认的 cubic 在高延迟、有丢包的链路上表现一般。BBR 由 Google 提出,基于带宽和延迟建模,能在不太理想的网络下跑满带宽。

1
2
3
4
5
6
7
# 检查当前算法
sysctl net.ipv4.tcp_congestion_control

# 开启 BBR
echo "net.core.default_qdisc = fq" >> /etc/sysctl.d/99-turbo.conf
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.d/99-turbo.conf
sysctl --system

注意:BBR 必须搭配 fq(fair queue)队列算法才能发挥最佳效果。

UDP 缓冲区:关键中的关键

跑 QUIC 这类基于 UDP 的协议时,默认的缓冲区大小会成为严重瓶颈。内核默认值通常只有 200KB 左右,高吞吐下会频繁丢包。

1
2
3
4
5
6
7
# /etc/sysctl.d/99-turbo.conf
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192

rmem_maxwmem_max 调到 64MB,足以应对千兆以上的吞吐。这个改动对 QUIC 协议的提升尤其明显。

其他有用的参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# TCP Fast Open
net.ipv4.tcp_fastopen = 3

# 禁用慢启动后的空闲重置
net.ipv4.tcp_slow_start_after_idle = 0

# 连接队列
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192

# 文件描述符上限
fs.file-max = 1048576

别忘了 /etc/security/limits.d/ 里也要放开 nofile 限制,否则应用层面还是会被卡住。

内核选择

XanMod 内核相比官方内核更新更激进,包含了不少调度器和网络栈的优化补丁。Debian 上安装:

1
2
3
echo "deb http://deb.xanmod.org releases main" | tee /etc/apt/sources.list.d/xanmod-release.list
wget -qO - https://dl.xanmod.org/archive.key | gpg --dearmor -o /usr/share/keyrings/xanmod-archive-keyring.gpg
apt update && apt install linux-xanmod-x64v3

验证效果

调优前后用 iperf3 对比一下:

指标调优前调优后
单连接吞吐~200 Mbps~940 Mbps
高延迟链路频繁卡顿平稳

参数不是越大越好,要结合实际机器配置和链路情况调整。建议改一项测一项,逐步逼近最优。