海外服务器如何开启BBR?以Linux为例完成配置与生效验证
在具备 Linux 内核支持的海外服务器上开启 BBR,核心是确认当前内核包含 TCP BBR 模块,将 TCP 默认拥塞控制算法设置为 bbr,并为新建网络设备配置 fq 队列。Ubuntu、Debian 以及部分较新的 RHEL 系发行版通常可以直接配置,但最终应以服务器实际内核检测结果为准。
下面以 Ubuntu 20.04/22.04/24.04、Debian 10/11/12 等常见 Linux 环境为主,同时兼顾 RHEL 系发行版。操作需要 root 或 sudo 权限,目标是让新建立的 TCP 连接使用 BBR,并通过 sysctl、tc 和 ss 完成生效验证。
适用环境与前置条件
操作系统与内核要求
| 检查项 | 要求或建议 |
|---|---|
| 操作系统 | Ubuntu、Debian,或内核已启用 BBR 的 RHEL 系发行版 |
| Linux 内核 | 通常需要 4.9 及以上,并且编译时启用了 BBR |
| 权限 | root 或可执行 sudo 的用户 |
| 依赖命令 | sysctl、ss、tc、modprobe |
| 队列调度 | 建议使用 fq,用于配合 BBR 的发送速率控制 |
| 业务协议 | BBR 作用于 TCP,不能直接改变 UDP 业务的拥塞控制 |
| 上线目标 | 新建 TCP 连接默认使用 bbr,配置重启后仍然有效 |
BBR 只能影响本机作为 TCP 发送端时的传输行为。例如,服务器向外提供文件、网页或接口服务时,服务器侧的出站 TCP 连接可能使用 BBR;如果服务器只是下载远端内容,真正负责发送数据的是远端主机,服务器本地开启 BBR 并不能强制改变远端的拥塞控制算法。
开启 BBR 不会改变物理链路的基础延迟,也不会自动修复丢包、路由绕行或远端服务限速。它的作用是调整 TCP 拥塞控制和发送节奏,因此需要通过实际的新 TCP 连接进行验证。
一、检查系统版本与依赖
先确认操作系统、内核版本以及配置所需命令是否存在。以下命令适用于大多数 systemd Linux 服务器:
cat /etc/os-release
uname -r
for cmd in sysctl ss tc modprobe; do
if command -v "$cmd" >/dev/null 2>&1; then
printf '%s: %s\n' "$cmd" "$(command -v "$cmd")"
else
printf '%s: missing\n' "$cmd"
fi
done
重点关注以下输出:
Linux 内核版本:4.9 或更高
sysctl:通常来自 procps 或 procps-ng
ss、tc:通常来自 iproute2 或 iproute
modprobe:通常来自 kmod
如果命令缺失,可以根据发行版补齐依赖。
Ubuntu 或 Debian 安装依赖
sudo apt-get update
sudo apt-get install -y iproute2 procps kmod
RHEL 系发行版安装依赖
较新的 RHEL、Rocky Linux、AlmaLinux 等系统通常使用 dnf:
sudo dnf install -y iproute procps-ng kmod
如果系统只有 yum,可以将命令中的 dnf 替换为 yum。安装依赖只补充管理命令,不会自动升级内核。对于内核较旧的系统,应优先使用发行版或云平台提供的匹配内核,避免直接复制其他服务器的内核模块。
二、确认内核是否支持 BBR
先查询当前内核已注册的拥塞控制算法、默认算法和默认队列:
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_allowed_congestion_control
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
支持 BBR 的典型输出如下:
net.ipv4.tcp_available_congestion_control = reno cubic bbr
net.ipv4.tcp_allowed_congestion_control = reno cubic bbr
net.ipv4.tcp_congestion_control = cubic
net.core.default_qdisc = fq_codel
这里的判断方式是:
tcp_available_congestion_control中出现bbr,说明当前内核能够识别 BBR;tcp_congestion_control显示当前默认算法,常见初始值是cubic;default_qdisc显示新网络设备默认使用的队列调度算法,常见值包括fq、fq_codel或pfifo_fast;bbr不在可用算法列表中时,不要直接写入配置文件强行启用。
还可以检查内核配置文件:
grep -E 'CONFIG_TCP_CONG_BBR|CONFIG_NET_SCH_FQ' \
"/boot/config-$(uname -r)" 2>/dev/null || true
不同发行版的内核配置位置可能不同。如果 /boot/config-$(uname -r) 不存在,不代表内核一定不支持 BBR,应以 tcp_available_congestion_control 和 modprobe 检查结果为准。
尝试加载 BBR 与 fq 模块
如果前面的可用列表没有显示 BBR,可以尝试加载内核模块:
sudo modprobe tcp_bbr
sudo modprobe sch_fq
加载后再次检查:
sysctl net.ipv4.tcp_available_congestion_control
lsmod | grep -E '(^| )(tcp_bbr|sch_fq) ' || true
如果 modprobe tcp_bbr 报出类似以下错误:
modprobe: FATAL: Module tcp_bbr not found in directory ...
通常表示当前运行内核没有对应模块,可能是内核版本过低、内核未编译 BBR,或者发行版的内核模块包没有安装。此时应先更换为发行版或云平台支持的内核,再继续配置。
不要从其他内核版本目录复制 tcp_bbr.ko。内核模块需要与正在运行的内核版本匹配,强行复制可能导致模块加载失败,严重时会影响系统启动。
三、备份现有配置
在修改持久化配置前,先备份 /etc/sysctl.conf、/etc/sysctl.d 和当前运行值。这样可以只回滚 BBR 相关设置,不必覆盖服务器上的其他内核参数。
BACKUP_DIR="/root/bbr-backup-$(date +%Y%m%d-%H%M%S)"
sudo install -d -m 700 "$BACKUP_DIR"
sudo cp -a /etc/sysctl.conf "$BACKUP_DIR/sysctl.conf" 2>/dev/null || true
sudo cp -a /etc/sysctl.d "$BACKUP_DIR/sysctl.d"
{
echo "tcp_congestion_control=$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null || echo unavailable)"
echo "default_qdisc=$(sysctl -n net.core.default_qdisc 2>/dev/null || echo unavailable)"
} | sudo tee "$BACKUP_DIR/runtime-values.txt" >/dev/null
echo "备份目录:$BACKUP_DIR"
同时检查系统是否已经存在相关参数,避免被其他配置文件覆盖:
sudo grep -RnsE \
'^[[:space:]]*net\.(core\.default_qdisc|ipv4\.tcp_(congestion_control|allowed_congestion_control))' \
/etc/sysctl.conf /etc/sysctl.d 2>/dev/null || true
如果多个文件同时设置了同一个参数,应记录它们的加载顺序。通常可以使用一个编号较后的文件作为最终配置,但不要在不了解现有运维系统的情况下随意删除其他文件。
四、写入 BBR 持久化配置
确认 tcp_available_congestion_control 中已经出现 bbr 后,创建独立的 sysctl 配置文件:
sudo tee /etc/sysctl.d/99-bbr.conf >/dev/null <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
配置项含义如下:
| 参数 | 作用 |
|---|---|
net.ipv4.tcp_congestion_control | 指定新建 TCP 连接默认使用的拥塞控制算法 |
net.core.default_qdisc | 指定新建网络设备的默认队列调度算法 |
fq | 为 TCP 发送提供基于时间的排队和 pacing 支持,通常适合与 BBR 配合 |
这里不建议直接覆盖 net.ipv4.tcp_allowed_congestion_control。该参数可能还包含系统原有的 reno、cubic 等算法,除非已经明确了解当前策略,否则没有必要为了启用 BBR 而删减已有算法。
五、加载配置并验证即时状态
只加载刚创建的文件,避免使用 sysctl --system 时同时重新应用所有系统参数:
sudo sysctl -p /etc/sysctl.d/99-bbr.conf
成功时通常会看到类似输出:
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
随后读取实际运行值:
sysctl -n net.core.default_qdisc
sysctl -n net.ipv4.tcp_congestion_control
预期结果为:
fq
bbr
如果 sysctl -p 报错,先不要重启服务器。常见情况是当前内核不认识 bbr 或 fq,此时可以删除刚创建的文件,恢复原有运行状态:
sudo rm -f /etc/sysctl.d/99-bbr.conf
配置文件加载成功后,通常不需要为了让 tcp_congestion_control 立即生效而重启服务器。需要注意的是,默认拥塞控制算法主要作用于新建 TCP 连接,已经建立的 SSH、HTTP 或数据库连接不一定会立即切换。
让模块在重启后提前加载
如果 tcp_bbr 和 sch_fq 是以模块形式存在,而不是直接编译进内核,在使用 systemd 的发行版上可以配置开机加载:
if [ -d /etc/modules-load.d ] && [ ! -e /etc/modules-load.d/bbr.conf ]; then
printf '%s\n' tcp_bbr sch_fq | sudo tee /etc/modules-load.d/bbr.conf >/dev/null
fi
如果系统中已经存在 /etc/modules-load.d/bbr.conf,应先查看内容,不要直接覆盖:
sudo cat /etc/modules-load.d/bbr.conf 2>/dev/null || true
如果模块已经编译进内核,modules-load.d 不是必需项;保留一个内容正确的加载文件通常也不会影响正常运行。
六、检查当前网卡的队列调度
net.core.default_qdisc = fq 主要影响新建网络设备。正在运行的网卡可能仍然保留原有队列,因此需要用 tc 查看实际状态。
先确定默认路由对应的网卡:
IFACE=$(ip -o route show default | awk 'NR==1 {print $5}')
printf '默认网卡:%s\n' "$IFACE"
if [ -n "$IFACE" ]; then
sudo tc qdisc show dev "$IFACE"
else
echo "未找到默认路由,请使用 ip route 或 ip addr 手动确认业务网卡"
fi
理想情况下可以看到类似结果:
qdisc fq 8001: root refcnt 2 limit 10000p buckets 1024 orphan_mask ...
如果当前显示的是 fq_codel,这不代表 BBR 配置失败。BBR 默认算法和网卡当前队列是两个不同层面的参数,只是 fq 通常更适合配合 BBR 的 pacing。
如果业务确实要求立即将简单的生产网卡切换为 fq,可以先记录现状,再在维护窗口执行:
sudo tc qdisc show dev "$IFACE" | \
sudo tee "$BACKUP_DIR/qdisc-${IFACE}.txt" >/dev/null
sudo tc qdisc replace dev "$IFACE" root fq
sudo tc qdisc show dev "$IFACE"
tc qdisc replace 会改变该网卡上所有流量的排队方式,可能造成短暂的排队变化。对于已经配置了复杂流量整形、虚拟队列或云平台网络管理策略的接口,不要直接执行这条命令,应先确认原有 qdisc 的类型和参数。若不要求立即切换,可以只保留 sysctl 配置,待计划重启后由系统重新创建网络设备。
七、通过新 TCP 连接验证 BBR
1. 查看默认算法
首先确认全局默认值:
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
结果应包含:
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
这只能证明系统默认配置正确,还需要检查实际 TCP socket。

2. 查看已建立连接
sudo ss -tin state established
如果当前服务器有新建立的 TCP 连接,输出中通常会在连接详情中看到 bbr,示例形式如下:
ESTAB 0 0 192.0.2.10:22 198.51.100.20:53012
bbr wscale:7,7 rto:204 rtt:32.1/4.8 ...
不同版本的 iproute2 输出格式会有所差异,可能显示为 bbr 或 cong bbr。重点是连接详情中的拥塞控制算法,而不是 IP 地址、窗口大小或 RTT 数值。
如果当前连接仍显示 cubic,先考虑以下原因:
- 该连接是在修改配置之前建立的;
- 当前没有实际建立的 TCP 连接;
- 检查的是 UDP 业务;
- 应用连接建立在另一台服务器上;
- sysctl 文件加载失败或被其他配置覆盖。
最简单的验证方式是:保留当前 SSH 会话,配置完成后重新打开一个新的 SSH 会话,再执行 ss -tin 查看新会话。新连接通常会读取当前默认算法。
3. 使用测试文件产生持续流量
如果服务器上有自有测试文件或测试接口,可以建立一个短时间的 TCP 下载连接。将地址替换为实际可访问的测试资源:
curl --http1.1 -4 -L --max-time 60 \
-o /dev/null \
https://your-domain.example/test-file.bin &
CURL_PID=$!
sleep 2
sudo ss -tin state established
wait "$CURL_PID"
curl 仅用于产生 TCP 流量,不要求改变业务配置。验证完成后应停止测试,避免在生产环境长时间占用带宽。
4. 检查 qdisc 统计信息
在存在业务流量时,可以查看 fq 的统计:
if [ -n "$IFACE" ]; then
sudo tc -s qdisc show dev "$IFACE"
fi
如果当前网卡使用 fq,输出中会包含 qdisc fq 以及发送包、丢弃包等统计项。统计值会随着业务变化,不应将某个固定数字当作成功标准。验收重点是 qdisc 类型正确、计数会随流量变化,并且业务连接没有异常。
常见失败情况与处理方法
内核不包含 BBR
表现为:
net.ipv4.tcp_available_congestion_control = reno cubic
或者:
modprobe: FATAL: Module tcp_bbr not found ...
处理顺序如下:
- 使用
uname -r记录当前内核; - 查看云平台或发行版提供的可用内核;
- 安装与当前系统匹配的支持 BBR 的内核;
- 在维护窗口重启并确认
uname -r已切换; - 再次执行
sysctl net.ipv4.tcp_available_congestion_control。
如果服务商不允许更换内核,系统层面无法通过普通 sysctl 配置补出 BBR,只能继续使用当前算法。
sysctl 提示参数无效
如果执行以下命令时报错:
sysctl: cannot stat /proc/sys/net/core/default_qdisc: No such file or directory
或:
sysctl: setting key ...: Invalid argument
通常表示当前内核缺少对应功能,或者模块尚未加载。应先检查:
sudo modprobe tcp_bbr
sudo modprobe sch_fq
sysctl net.ipv4.tcp_available_congestion_control
如果仍然失败,不要反复执行配置加载命令,也不要重启验证。先删除 99-bbr.conf,恢复到原有配置,再处理内核问题。
默认值是 bbr,但 ss 仍然显示 cubic
这种情况首先检查连接是否为新建立。默认算法切换不会强制改写所有已存在的 TCP socket。可以重新打开 SSH 会话,或重新启动对应应用连接。
如果新连接仍为 cubic,检查配置来源:
sudo grep -RnsE \
'^[[:space:]]*net\.ipv4\.tcp_congestion_control' \
/etc/sysctl.conf /etc/sysctl.d 2>/dev/null
sysctl net.ipv4.tcp_congestion_control
如果存在多个配置文件,应确认编号较后的文件没有重新写入 cubic。还要检查是否有启动脚本、配置管理程序或云初始化服务在开机后覆盖参数。
当前 qdisc 不是 fq
先确认模块和设备名称:
sudo modprobe sch_fq
sudo tc qdisc show dev "$IFACE"
如果设备由云平台或已有流量控制策略管理,不建议在没有维护窗口的情况下直接替换 qdisc。net.core.default_qdisc = fq 已经可以作为持久化配置,后续重启并重新创建网络设备后再复查。
开启后网络质量没有明显变化
BBR 不会直接降低基础 RTT,也不会消除链路丢包。还需要区分以下情况:
- 服务器是发送端还是接收端;
- 应用是否确实使用 TCP;
- 远端服务是否本身限速;
- 当前问题是拥塞控制,还是线路丢包、路由变化或服务端响应慢;
- 新连接是否真的显示
bbr。
因此,sysctl 和 ss 验证成功,只能说明 BBR 已经应用到符合条件的新 TCP 连接,不等于所有业务指标都会固定改善。
回滚 BBR 配置
如果需要恢复原有算法,先删除持久化配置,再将运行中的参数改回备份值。常见旧配置是 cubic,但应以前面保存的 runtime-values.txt 为准:
sudo rm -f /etc/sysctl.d/99-bbr.conf
sudo sysctl -w net.ipv4.tcp_congestion_control=cubic
sudo sysctl -w net.core.default_qdisc=fq_codel
上面两项中的 cubic 和 fq_codel 只是常见示例。如果备份中原来是 reno、pfifo_fast 或其他值,应替换为实际备份值:
sudo cat /root/bbr-backup-时间戳/runtime-values.txt
如果之前创建了模块自动加载文件,并且该文件原本不存在,可以删除:
sudo rm -f /etc/modules-load.d/bbr.conf
如果曾经使用 tc qdisc replace 手动修改过网卡队列,应根据保存的 qdisc 记录恢复原来的类型和参数。例如原来明确是 fq_codel 时,可以使用:
sudo tc qdisc replace dev "$IFACE" root fq_codel
不要在不知道原始参数的情况下直接执行这条示例命令。复杂 qdisc 可能包含 limit、flows、quantum、句柄或分类规则,应该按照备份内容恢复,或者通过维护重启让系统重新加载原有网络配置。
已经建立的 TCP 连接可能继续保持原有拥塞控制状态。回滚后重新建立连接,再用以下命令确认:
sysctl net.ipv4.tcp_congestion_control
sudo ss -tin state established
上线验收清单
完成海外服务器开启 BBR 后,可以按以下顺序验收:
uname -r显示的是预期运行内核;net.ipv4.tcp_available_congestion_control中包含bbr;net.ipv4.tcp_congestion_control的运行值为bbr;net.core.default_qdisc的运行值为fq;- 默认业务网卡的
tc qdisc show能看到预期队列; - 新建立的 TCP 连接在
ss -tin中显示bbr; - 业务请求、SSH 新会话和测试下载没有异常;
/etc/sysctl.d/99-bbr.conf已保存,重启后仍会加载;- 备份目录和 qdisc 记录已保留,出现异常时可以按原值回滚。
如果需要验证重启持久性,应提前确认拥有云平台控制台或带外访问能力,并在维护窗口执行。重启回来后重新检查 sysctl、tc 和新建 TCP 连接,确认 BBR 配置没有被启动脚本或其他系统配置覆盖。