跳转到内容

服务器调优

本页介绍 rVPN 服务器的操作系统级调优,特别针对高延迟或有丢包的国际线路(例如,中国的客户端连接位于美国的服务器)。

  • 通过 VPN 的 ping 起初正常,随时间增长(例如从 500 毫秒 → 5–12 秒)。
  • 尽管服务器带宽充裕,吞吐量却降到几十 kbps。
  • ss -ti 显示极小的拥塞窗口(cwnd: 2)、高重传,以及不断增长的 bytes_retrans
  • 同一客户端和服务器在其他网络下工作正常(例如手机 5G vs 固网 Wi-Fi)。

这些症状通常意味着客户端与服务器之间的 TCP 连接经过了一条有丢包或严重整形的链路。Linux 的默认拥塞控制算法 CUBIC 会将丢包视为网络拥塞并激进地缩小发送窗口,导致延迟迅速攀升。

BBR(Bottleneck Bandwidth and RTT)对链路建模,而不是把丢包当作拥塞。在高丢包、高 RTT 的路径上,它比 CUBIC 能保持更高的吞吐量和更稳定的延迟。

Terminal window
sysctl net.ipv4.tcp_available_congestion_control

如果列表中没有 bbr,请加载模块:

Terminal window
sudo modprobe tcp_bbr

要在开机时自动加载 tcp_bbr,创建 /etc/modules-load.d/tcp_bbr.conf

tcp_bbr
Terminal window
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr

创建 /etc/sysctl.d/99-rvpn-tcp-tuning.conf

# rVPN TCP tuning for high-latency / lossy international paths
net.ipv4.tcp_congestion_control=bbr
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 262144 16777216
net.ipv4.tcp_wmem=4096 262144 16777216
net.ipv4.tcp_notsent_lowat=16384

应用:

Terminal window
sudo sysctl --system

增大缓冲区可为每个 TCP 连接留出足以覆盖 250–350 毫秒 RTT 路径带宽时延积的余量。

重连 VPN 客户端后(已有连接会保留旧的拥塞控制算法):

Terminal window
sudo ss -ti | grep -A5 'YOUR_CLIENT_IP'

查找:

bbr wscale:...

如果仍显示 cubic,说明客户端尚未重连。

FreeBSD 也通过 cc_bbr 内核模块支持 BBR,对于高丢包、高 RTT 的路径这是最佳选择。

检查模块是否已加载:

Terminal window
kldstat | grep cc_bbr

若未加载:

Terminal window
sudo kldload cc_bbr

要在开机时自动加载,将下行添加到 /boot/loader.conf

cc_bbr_load="YES"
Terminal window
sudo sysctl net.inet.tcp.cc.algorithm=bbr
sudo sysctl kern.ipc.maxsockbuf=16777216
sudo sysctl net.inet.tcp.recvspace=16777216
sudo sysctl net.inet.tcp.sendspace=16777216

要让这些设置在重启后保持,创建 /etc/sysctl.conf

# rVPN TCP tuning for high-latency / lossy international paths
net.inet.tcp.cc.algorithm=bbr
kern.ipc.maxsockbuf=16777216
net.inet.tcp.recvspace=16777216
net.inet.tcp.sendspace=16777216

检查当前的拥塞控制算法:

Terminal window
sysctl net.inet.tcp.cc.algorithm

FreeBSD 不像 Linux 的 ss 那样便捷地暴露每个连接的拥塞控制名称,因此请在重连客户端后使用 pingiperf3 检验吞吐量和延迟。

  • 接口 MTU:Google Cloud VPC 默认使用 1460 字节 MTU。rVPN 的 TUN MTU 为 1420,加上 TLS/WebSocket 开销后仍能舒适地容纳在 VPC MTU 内。
  • CPUrvpn-server 每连接的加密是单线程但异步的;1 vCPU 的虚拟机通常足以应对一两个客户端,但在更高吞吐量下可能成为瓶颈。
  • 磁盘 / 日志:在默认 INFO 级别下,服务器会为每个帧记录日志。繁忙的客户端会产生大量 journald I/O。请在生产中考虑降低日志详细程度。

如果在 BBR 与缓冲区调优之后延迟和丢包依然存在,问题可能不在服务器:

  • 国际段的 ISP/路由问题
  • 针对 443 端口 TLS 的运营商级 DPI 或限速
  • 本地 Wi-Fi 路由器的激进 QoS 或过小缓冲区

这些情况下,请尝试不同的客户端网络(手机热点、不同 ISP),或选择距离客户端更近的服务器位置。