解决高延迟场景中OpenVPN速度缓慢的问题

  • 978 字
  • 0 条评论

连接协议选择

强制使用 UDP,1% 丢包在 TCP 下会被放大为严重的延迟,而 UDP 下则基本无影响。

1
proto udp

增加缓冲区

根据实际延迟与最大带宽计算出合理的缓冲区大小,单位为字节。
如延迟为100ms,最大带宽为100Mbps,那么缓冲区大小应该为100ms * 100Mbps * 1000 / 8 = 1250000Bytes。对应的配置为:

1
2
3
4
sndbuf 1250000
rcvbuf 1250000
push "sndbuf 1250000"
push "rcvbuf 1250000"

上述值还可以适当调大。

增加服务器的TCP/UDP缓冲区大小

在/etc/sysctl.conf中添加以下内容:

1
2
3
4
5
6
7
8
9
# 增大内核 UDP 缓冲区限制,适配高带宽深管道(BDP)
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.rmem_default=16777216
net.core.wmem_default=16777216

# 启用 BBR 拥塞控制算法(对高延迟环境至关重要)
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

提高nginx的缓冲区大小

修改nginx的配置文件,添加/修改如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http {
server {
listen 443 quic reuseport; # 启用 QUIC
http3 on; # 启用 HTTP/3

# 核心:增大单条 H3 流的缓冲区
# 设为 12m 可以支撑 200ms 延迟下约 500Mbps 的理论吞吐量
http3_stream_buffer_size 12m; # 增大单条 H3 流的缓冲区

# 增大代理缓冲区
proxy_buffers 16 1024k;
proxy_busy_buffers_size 15360k;
}
}

常见问题

OpenVPN 速度慢的常见原因是什么?

高延迟链路上默认缓冲区太小是主因:带宽与延迟的乘积(BDP)远超默认窗口,吞吐量被卡死;其次是用了 TCP 封装,1% 的丢包会被放大成严重延迟。

OpenVPN 的 sndbuf/rcvbuf 缓冲区怎么计算?

按带宽延迟积计算:缓冲区字节数 = 带宽(Mbps) × 延迟(ms) × 1000 / 8。例如延迟 100ms、带宽 100Mbps 时,应设置 sndbuf/rcvbuf 约 1250000 字节。

为什么要强制 UDP 并开启 BBR?

UDP 没有 TCP 的重传风暴,丢包影响小;BBR 拥塞控制算法针对高带宽深管道优化。两者配合再调大内核缓冲区,高延迟环境下的吞吐量能显著提升。

分享
分享提示信息