背景
在一台 50Mbps 带宽的云主机上部署 VPN 中转服务时,遇到了经典的 Bufferbloat(缓冲区膨胀)问题:一旦有大文件下载占满带宽,SSH 延迟从 50ms 飙升到 200ms+,严重影响交互体验。
传统的 fq + bbr 组合在窄带宽场景下效果有限,因为 fq 只做公平队列,无法主动控制排队延迟。
方案:DualPI2 + BBR
Linux 6.17 内核引入了 sch_dualpi2 调度器,专为低延迟设计:
| 调度器 | 工作方式 |
|---|---|
fq |
公平队列,让每个连接平分带宽,但不管排队延迟 |
dualpi2 |
主动管理排队时间,通过 ECN 标记/丢包强制发送端降速,死守延迟底线 |
配置步骤
1. 内核要求
需要 Linux 6.17+ 内核(包含 sch_dualpi2 模块)。
2. sysctl 配置
编辑 /etc/sysctl.conf:
# --- 核心调度方案 ---
net.core.default_qdisc = dualpi2
net.ipv4.tcp_congestion_control = bbr
# --- 极致延迟优化 ---
net.ipv4.tcp_ecn = 1 # 必须开启,dualpi2 核心手段
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_recovery = 1 # RACK 快速修复乱序
net.ipv4.tcp_notsent_lowat = 8192 # 降低 BBR 内核缓冲量
# --- 缓冲区设置(针对 50Mbps,严防膨胀)---
net.core.rmem_max = 4194304
net.core.wmem_max = 4194304
net.ipv4.tcp_rmem = 4096 16384 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
# --- 稳定性优化 ---
net.core.somaxconn = 2048
net.ipv4.tcp_max_syn_backlog = 2048
net.mptcp.enabled = 1
3. 模块自动加载
|
|
4. 网卡持久化(udev 规则)
创建 /etc/udev/rules.d/99-ens3-dualpi2.rules:
|
|
将
ens3替换为你的网卡名
5. 应用配置
|
|
验证方法
检查 dualpi2 状态
|
|
压力测试(服务器禁 Ping 方案)
传统 ping 在禁 ICMP 的服务器上失效,改用内核 RTT 统计:
|
|
测试结果
在 50Mbps 带宽满载情况下:
| 指标 | 结果 |
|---|---|
| 满载带宽 | 50 Mbps(峰值 51.4 Mbps) |
| 满载时 SSH RTT | 54.78ms(物理极限 48.33ms) |
| RTT 抖动 | 2.08ms ✅ |
| 拥塞控制 | 全连接 BBR 生效 |
| 丢包恢复 | RACK 快速修复,无拥塞崩溃 |
满载下载时 SSH 延迟仅高出物理极限 6.4ms,抖动 2ms,Bufferbloat 完全控制。
原理解析
- DualPI2 在微秒级压制排队延迟,默认 target 5ms
- BBR 在毫秒级压制带宽膨胀,周期性探测真实 RTT
- ECN 让发送端提前感知拥塞,避免丢包
- RACK 快速修复乱序,避免拥塞窗口崩溃
这套组合在 50Mbps 窄带宽下实现了近乎完美的延迟/吞吐平衡。
参考
|
|