跳到主要内容

Rust vs Go: WebRTC Data Channel 性能基准测试

· 阅读需 5 分钟
Miuda Team
Building conversational AI tooling

简介

在实时通信的世界中,性能至关重要。WebRTC 已成为点对点音频、视频和数据传输的标准。虽然浏览器实现众所周知,但服务器端和原生实现对于构建可扩展的基础设施、网关和高性能客户端至关重要。

本文展示了一项性能基准测试,比较了三种著名的 WebRTC 实现,代码可在 restsend/rustrtc 获取:

  1. RustRTC: 一个纯 Rust 实现的 WebRTC(被测项目)。
  2. webrtc-rs: 最流行的 Rust 实现(Pion 的移植版)。
  3. Pion: 业界标准的 Go 语言 WebRTC 实现。

方法论

基准测试侧重于 Data Channel(数据通道)的性能,特别是吞吐量和连接建立延迟。

  • 环境: macOS, Apple Silicon (M-series), 10 个并发连接。
  • 场景:
    1. 在本地建立 10 个 PeerConnection(回环)。
    2. 在每个连接上打开一个 Data Channel。
    3. 尽可能快地发送 1KB 数据包,持续 10 秒。
    4. 测量传输的总字节数、发送的消息数、连接延迟、CPU 使用率和内存占用。
  • 模式: Release 构建 (cargo run --release)。

基准测试架构

基准测试套件旨在隔离并测量每个库中 Data Channel 实现的原始性能。架构包含以下组件:

  1. 驱动与隔离: 主基准测试运行器是用 Rust 编写的。它在单独的进程中执行每个实现(RustRTC, webrtc-rs, 和 Pion)。这确保了一个实现的资源使用(CPU 和内存)不会干扰另一个,并允许进行精确的基于 ps 的监控。

  2. 并发模型:

    • 测试生成 10 对并发 PeerConnection。
    • 每一对都在其自己的异步任务(Go 中的 Goroutine,Rust 中的 Tokio 任务)中运行,以模拟多客户端服务器环境。
  3. 流量模式(负载测试):

    • 设置: 每一对执行本地回环连接(DTLS/SRTP 握手)并建立 Data Channel。
    • 爆发阶段: 连接后,发送方进入紧密循环,尽可能快地发送 1KB 数据包,持续 10 秒
    • 流控: 测试依赖于底层的 SCTP 流控。发送方尝试使通道饱和。
  4. 指标收集:

    • 吞吐量: 通过将所有 10 个连接接收的总字节数除以持续时间计算得出。
    • 资源监控: 一个专用的后台线程通过定期轮询操作系统(通过 ps 命令)来监控进程的 RSS 内存和 CPU 使用率,确保监控本身的开销最小。

结果

Comparison (Baseline: webrtc)
Metric | webrtc | rustrtc | pion
--------------------------------------------------------------------------------
Duration (s) | 10.02 | 10.02 | 11.02
Setup Latency (ms) | 1.14 | 0.69 | 1.80
Throughput (MB/s) | 135.45 | 213.38 | 177.92
Msg Rate (msg/s) | 138696.71 | 218497.60 | 182190.56
CPU Usage (%) | 820.38 | 829.33 | 596.12
Memory (MB) | 28.00 | 10.00 | 41.00
--------------------------------------------------------------------------------

webrtc_benchmark

1. 吞吐量 (MB/s)

吞吐量是所有连接每秒传输的数据总量。

Throughput (MB/s) (Higher is better)
webrtc | █████████████████████████ 135.45
rustrtc | ████████████████████████████████████████ 213.38
pion | █████████████████████████████████ 177.92

分析:

  • RustRTC 展示了最高的吞吐量,达到 213.38 MB/s
  • Pion 紧随其后,达到 177.92 MB/s
  • webrtc-rs 达到 135.45 MB/s

RustRTC 处于领先地位,展示了其实现的高效性。Pion 表现出人意料地好,在这个特定的吞吐量测试中超过了 webrtc-rs,表明其近期版本或特定测试配置下有显著优化。

2. 消息速率 (msg/s)

与吞吐量类似,这测量每秒处理的 1KB 消息数量。

Message Rate (msg/s) (Higher is better)
webrtc | █████████████████████████ 138696.71
rustrtc | ████████████████████████████████████████ 218497.60
pion | █████████████████████████████████ 182190.56

分析:

  • RustRTC 每秒处理超过 21.8 万条消息
  • Pion 每秒处理约 18.2 万条消息
  • webrtc-rs 每秒处理约 13.8 万条消息

3. 连接延迟 (ms)

建立 PeerConnection 所需的时间(DTLS 握手 + ICE 连接)。

Latency (ms) (Lower is better)
webrtc | █████████████████████ 1.14
rustrtc | █████████████ 0.69
pion | ███████████████████████████████████ 1.80

分析:

  • RustRTC 建立连接最快 (0.69 ms)。
  • 所有三个实现在回环上都极快,连接时间均在 2ms 以内。

4. 资源使用

CPU Usage (%) (Lower is better)
webrtc | ███████████████████████████████████████ 820.38
rustrtc | ████████████████████████████████████████ 829.33
pion | ████████████████████████████ 596.12

两个 Rust 实现都有效地利用了可用的 CPU 资源来最大化吞吐量。Pion 使用较少的 CPU,但实现的吞吐量明显较低,表明它可能受到其他因素(锁、GC 或运行时调度)的限制。

Memory (MB) (Lower is better)
webrtc | ███████████████████████████ 28.00
rustrtc | █████████ 10.00
pion | ████████████████████████████████████████ 41.00

分析:

  • RustRTC 最节省内存,仅使用 10 MB
  • webrtc-rs 使用 28 MB
  • Pion 使用 41 MB,这非常合理且与 Rust 实现相当,显示了有效的内存管理。

结论

在这个 Data Channel 基准测试中:

  1. RustRTC 占据榜首,提供了最高的吞吐量最低的延迟最低的内存占用
  2. Pion 表现出令人印象深刻的性能,在吞吐量方面位居第二,并保持了较低的内存使用率,证明它是高性能场景下非常有能力的实现。
  3. webrtc-rs 仍然是一个稳健的执行者,资源使用稳定,尽管在此特定基准测试中的原始吞吐量方面稍显落后。

对于需要最大效率、低延迟和高吞吐量的用例(如云游戏、实时文件传输或高频服务器端处理),RustRTC 是一个令人信服的选择。