上一篇 分享链接 返回 返回顶部

海外服务器如何开启BBR?以Linux为例完成配置与生效验证

发布人:Minchunlin 发布时间:2026-10-04 15:06 阅读量:11

在具备 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。

七、通过新 TCP 连接验证 BBR配图

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 ...

处理顺序如下:

  1. 使用 uname -r 记录当前内核;
  2. 查看云平台或发行版提供的可用内核;
  3. 安装与当前系统匹配的支持 BBR 的内核;
  4. 在维护窗口重启并确认 uname -r 已切换;
  5. 再次执行 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 配置没有被启动脚本或其他系统配置覆盖。

目录结构
全文