Rustls 有望超越 OpenSSL
内容提要
Rustls是用Rust编写的高质量TLS实现,性能优于OpenSSL。使用aws-lc-rs加密提供程序和jemalloc分配器可以实现最佳性能。Rustls的内存成本较低,数据发送吞吐量与OpenSSL相当。使用ChaCha20密码套件时,Rustls的吞吐量比OpenSSL低45%。Rustls在服务器端RSA握手次数减少,但在客户端提供更高吞吐量。使用ECDSA时情况相反。Rustls处理更多的恢复握手。
延伸解读
性能优势依赖配置选择
Rustls 的最佳性能并非默认达成,而是需要搭配 aws-lc-rs 加密提供程序和 jemalloc 分配器。文章指出,仅更换分配器就能让数据发送吞吐量翻倍以上,说明部署时的底层组件选择对实际表现影响显著。若沿用默认配置,可能无法充分体现 Rustls 的潜力。
内存效率是突出优势
在测试负载下,Rustls 每个会话高峰内存约 13KiB,OpenSSL 约 69KiB;C10K 场景总内存分别为 132MiB 和 688MiB。这一差距意味着在同等硬件上,Rustls 能支撑更多并发连接,对于内存敏感的高密度服务场景具有实际意义。
密码套件与场景差异明显
使用 AES 套件时,Rustls 发送吞吐量与 OpenSSL 相当,但接收吞吐量因 API 强制额外拷贝而低 7% 到 17%。使用 ChaCha20 时,Rustls 吞吐量低约 45%,部分原因是 OpenSSL 利用了 AVX-512 优化。此外,RSA 和 ECDSA 在服务器端与客户端表现相反,选型时需结合具体握手类型评估。
握手恢复性能显著领先
Rustls 每秒处理的恢复握手比 OpenSSL 多 80% 到 330%,具体取决于场景和恢复方式(会话 ID 或票证)。对于频繁建立短连接或需要快速恢复会话的服务,这一优势可能比完整握手性能更具实际价值,但文章未说明该优势在长期连接场景中的影响。
Q&A
Rustls 和 OpenSSL 在内存使用上差距有多大?
Rustls 的内存使用量显著低于 OpenSSL。在测试中,Rustls 每个会话高峰时约占用 13KiB,而 OpenSSL 约占用 69KiB。C10K 场景下,Rustls 内存使用量为 132MiB,OpenSSL 为 688MiB。
如何配置 Rustls 才能获得最佳性能?
要获得最佳整体性能,应使用 aws-lc-rs 加密提供程序(而不是 ring),并使用 jemalloc 分配器。与默认的 glibc malloc 相比,jemalloc 能使传出数据传输吞吐量增加一倍以上。
Rustls 在哪些场景下性能不如 OpenSSL?
使用基于 ChaCha20 的密码套件时,Rustls 的数据传输吞吐量比 OpenSSL 低约 45%。此外,在服务器端处理完整 RSA 握手时,Rustls 的每秒握手次数比 OpenSSL 少 30%(TLS 1.2)或 27%(TLS 1.3)。使用 ECDSA 时,Rustls 在客户端性能上稍逊于 OpenSSL。
Rustls 在握手性能上相比 OpenSSL 有什么优势?
Rustls 每秒处理的恢复握手次数比 OpenSSL 多 80% 到 330%(取决于场景),无论是使用会话 ID 还是基于票证的恢复。此外,在服务器端使用 ECDSA 时,Rustls 性能大幅优于 OpenSSL。
为什么说 Rustls 有望取代 OpenSSL?
Rustls 是用 Rust 编写的高质量 TLS 实现,旨在取代 OpenSSL 等不安全的替代方案。基准测试表明,Rustls 在数据传输吞吐量、每秒握手次数和内存使用量方面已经击败或媲美 OpenSSL,同时保持了内存安全。
Rustls 和 OpenSSL 在 AES 密码套件下的吞吐量对比如何?
使用基于 AES 的密码套件时,Rustls 的数据发送吞吐量与 OpenSSL 大致相同,但数据接收吞吐量因 API 强制额外副本而降低了 7% 到 17%。