本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
基准测试
ruststream-lapin 在每条消息上的开销:与裸 lapin 客户端对照的吞吐量,以及它自身代码的指令数和内存分配次数。
与裸客户端对照
第一张图在真实的 RabbitMQ 节点上用三种方式运行同一个场景。裸客户端 是一个手写的循环,直接驱动 lapin。Broker crate 是同一个循环跑在本 crate 上:Broker、队列描述符、订阅的流、投递自带的 ack 和它的发布者,外面没有运行时。RustStream 是用户写的服务:应用里的一个 #[subscriber] 处理器,通过同一个发布者发布。第一段差距是本 crate 比它所封装的客户端多付出的开销,第二段是运行时在其上增加的开销。
每个循环画成一条从最佳一轮到最慢一轮的横条,最佳一轮处有一个圆点,中位一轮处有一道刻痕。坐标轴的零点是裸客户端的最佳一轮,圆点落在零点右侧表示更慢。空心圆点表示该循环与裸客户端的差距小于各轮之间的波动。图下的表格给出最佳一轮,括号里是中位一轮。
两个场景对应 RabbitMQ 自带的两种队列类型。经典队列把消息放在内存里,用一个帧结算一次投递。仲裁队列先通过 Raft 复制每条消息并把它写下来,然后才交出去;这么昂贵的传输,几乎不给它上面的任何东西留下显现的余地。
代码的开销
第二张图统计一条消息在服务线程上的开销:稳态下由 callgrind 统计的指令数和由 DHAT 统计的内存分配次数。每个场景都是跑在 LapinBroker 上的服务,连接同一个节点。统计范围包括框架的分发、编解码器、本 crate 的代码,以及 lapin 在这个线程上做的工作。lapin 在自己的线程上读写套接字,那个线程不计入。每一行的内存分配大多来自客户端:每一次确认、每一次发布,都会在服务线程上创建 promise 和一个内部任务。冷启动 是建立连接、打开信道、声明队列、注册消费者并取得第一次投递一次性付出的开销。
结果
- 裸客户端
- Broker crate
- RustStream
- 各轮,从最佳到最慢
- 最佳一轮
- 中位一轮
- 轮次的波动范围
- 无法区分
ruststream-lapin 0.7.0 on ruststream 0.7.0, AMD Ryzen 9 7900X 12-Core Processor, Linux 7.2.10-x64v3-xanmod1-1, rabbitmq:4-management-alpine in Docker on localhost, 测量于 2026-10-18. 这些数字是怎样测得的
- 无法区分
- 无法区分
- 无法区分
- 无法区分
以表格显示数字
| 场景 | 裸客户端 | Broker crate | RustStream | 额外开销 |
|---|---|---|---|---|
| Classic queue, 512 B JSON, ack each | 63,187 msg/s (62,538) | 63,001 msg/s (62,226) (比客户端 无法区分) | 61,650 msg/s (60,015) | 无法区分 |
| Quorum queue, 512 B JSON, ack each | 33,202 msg/s (32,709) | 32,788 msg/s (32,446) (比客户端 无法区分) | 33,272 msg/s (33,183) | 无法区分 |
AMD Ryzen 9 7900X 12-Core Processor, x86_64, 427-5912 MHz, 12 physical, 24 logical, 62.4 GiB, unknown, Linux 7.2.10-x64v3-xanmod1-1, 1.99.0, 3.25.1, bench, inheriting release (opt-level = 3, lto = fat, codegen-units = 16, debug = line-tables-only), ruststream-lapin default (none), ruststream macros,json. ruststream-lapin 0.7.0, ruststream 0.7.0, 测量于 2026-10-18.
以表格显示数字
| 场景 | 指令数 | 内存分配 | 冷启动 |
|---|---|---|---|
| classic queue, JSON decode into a small struct, ack each | 14,617 | 16 | 370,049 / 217 |
| classic queue, reply published through LapinPublish | 22,145.8 | 27 | 367,859 / 219 |
| classic queue, batches of 64 assembled on the client | 14,994.4 | 16.3 | 377,775 / 223 |
机器
| 处理器 | AMD Ryzen 9 7900X 12-Core Processor |
|---|---|
| 架构 | x86_64 |
| 频率 | 427-5912 MHz |
| 核心数 | 12 physical, 24 logical |
| 内存 | 62.4 GiB |
| 内存速度 | unknown |
| 操作系统 | Linux 7.2.10-x64v3-xanmod1-1 |
| Broker | rabbitmq:4-management-alpine in Docker on localhost |
| 往返时间 | 69.8 us for one basic.qos answered by the server |
| 编译器 | 1.99.0 |
| 构建配置 | bench, inheriting release (opt-level = 3, lto = fat, codegen-units = 16, debug = line-tables-only) |
| Feature | ruststream-lapin default (none), ruststream macros,json |
| RUSTFLAGS | none (the recipe clears RUSTFLAGS, so the numbers are not tied to this CPU) |
| Valgrind | 3.25.1 |
这些数字来自本版本的 docs/benchmarks/results.json,由基准测试的 recipe 写入。方法论说明它们是怎样测得的,数字说明可以从中得出什么结论。