R-VPN 性能优化计划¶
实现状态¶
| 阶段 | 功能 | 状态 | 位置 |
|---|---|---|---|
| 阶段 1 | SplitRatchet 并发访问 | ✅ 已实现 | rvpn-core/src/crypto/ratchet.rs |
| 阶段 2 | 缓冲区大小优化 | ✅ 已实现 | 通道缓冲区:10,000 个槽位 |
| 阶段 3 | 客户端重连逻辑 | ✅ 已实现 | rvpn-client/src/tunnel.rs |
| 阶段 4 | 二进制协议迁移 | ✅ 已实现 | rvpn-core/src/protocol/codec.rs |
| 额外 | 连接池 | ✅ 已实现 | rvpn-server/src/handler.rs |
原始架构瓶颈(已解决)¶
1. DoubleRatchet 锁竞争 ✅ 已修复¶
问题:Arc<RwLock<DoubleRatchet>> 序列化了所有加密/解密操作。
解决方案:实现了 SplitRatchet,使用独立的 Arc<Mutex<SendingChain>> 和 Arc<Mutex<ReceivingChain>>:
- encrypt() 只锁定发送链
- decrypt() 只锁定接收链
- DH ratchet 操作仍需要两个锁(但发生频率较低)
结果:加密和解密操作真正的并发访问。
2. 缓冲区大小过小 ✅ 已修复¶
问题:有限的通道缓冲区大小导致背压。
解决方案:将通道缓冲区大小增加到 10,000 个槽位,以应对高吞吐量场景。
结果:更好地处理突发流量和大文件传输。
3. JSON 序列化开销 ✅ 已修复¶
问题:二进制数据在 JSON 中进行 Base64 编码,增加了约 33% 的开销。
解决方案:迁移到使用原始二进制编码的二进制协议。
结果:带宽减少约 30%,序列化更快。
4. 无连接复用 ✅ 已修复¶
问题:每个 HTTP 请求都创建一个新的代理连接。
解决方案:在服务器中实现了连接池。
结果:连接复用带来更好的性能。
5. 无客户端重连 ✅ 已修复¶
问题:当 WebSocket 断开时,客户端直接退出而不是重新连接。
解决方案:实现了自动重连功能,包括: - 清理过期连接 - 心跳机制 - 指数退避重试逻辑
结果:更好的用户体验,自动恢复连接。
性能基准测试¶
吞吐量测试¶
- 通过代理下载大文件(100MB)
- 结果:并发 ratchet 访问带来显著提升
并发测试¶
- 加载包含多个资源的网站(YouTube、新闻网站)
- 结果:多个并发连接下页面加载流畅
延迟测试¶
- 首字节时间测量
- 结果:由于二进制协议,延迟降低
重连测试¶
- 启动客户端和服务器
- 加载网页
- 终止服务器进程
- 重启服务器
- 结果:客户端重新连接并可以再次加载页面
备注¶
- TLS 由 Caddy 反向代理处理,因此我们不需要在服务器中实现 TLS
- Double Ratchet 协议需要严格的消息顺序 - 通过适当的链同步来维护
- 客户端重连意味着重新进行 X3DH 握手和 Double Ratchet 初始化(新会话)