本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
基准测试
ruststream-kinesis 在每条记录上的开销:与裸 aws-sdk-kinesis 客户端对照的吞吐量,以及它自身代码的指令数和内存分配次数。
与裸客户端对照
第一张图对着同一个 Kinesis 端点,把每个场景用三种方式运行。裸客户端 直接驱动 aws-sdk-kinesis。Broker crate 用一个自己的循环驱动本 crate 的订阅,上面没有运行时。RustStream 是用户写的服务:应用里的一个 #[subscriber] 处理器。第一项差值是本 crate 比它所封装的客户端多付出的开销,第二项是运行时在其上增加的开销。
每个循环画成一条横条,从最佳一轮延伸到最慢的一轮,圆点标出最佳一轮,缺口标出中位一轮。坐标轴的零点是裸客户端的最佳一轮,圆点在零点右侧表示更慢。空心圆点表示该循环与裸客户端的差异小于各轮的波动范围。图表下方的表格列出最佳一轮,括号里是中位数。
两个场景都读取一个分片,并为每条记录写入检查点。它们的区别在于检查点写到哪里:第一个场景把它保存在进程中,与默认的租约存储一样;第二个场景用条件写入把它写进一张 DynamoDB 表。裸循环把同样的检查点写到同样的地方,因此两行之间的差别来自存储,而不是本 crate。
代码的开销
第二张图统计一条记录在服务线程上的开销:稳态下 callgrind 测得的指令数和 DHAT 测得的内存分配次数。每个场景都是一个基于 KinesisBroker 的服务,连接同一个端点,使用默认的租约存储。计数包括框架的分发和本 crate 的代码。它还包括 AWS SDK 在该线程上的工作:构建并签名每个请求、HTTP 交换,以及解析每个应答。这部分工作占每个数字的大部分,几乎占满应答那一行,因此这些数字不能与客户端在自己线程上工作的 Broker 的数字相比。冷启动 是连接、打开订阅、列出分片、获取它的租约和迭代器,以及取得第一条记录一次性付出的开销。
结果
- 裸客户端
- Broker crate
- RustStream
- 各轮,从最佳到最慢
- 最佳一轮
- 中位一轮
- 轮次的波动范围
- 无法区分
ruststream-kinesis 0.7.0 on ruststream 0.7.0, AMD Ryzen 9 7900X 12-Core Processor, Linux 7.2.11-x64v3-xanmod1-1, localstack/localstack:4.14.0 (Kinesis and DynamoDB emulator) in Docker on localhost, not AWS, 测量于 2026-10-18. 这些数字是怎样测得的
- 无法区分
- 无法区分
- 无法区分
- 无法区分
以表格显示数字
| 场景 | 裸客户端 | Broker crate | RustStream | 额外开销 |
|---|---|---|---|---|
| one shard, 512 B JSON, in-process checkpoints | 358 msg/s (342) | 363 msg/s (346) (比客户端 无法区分) | 365 msg/s (340) | 无法区分 |
| one shard, 512 B JSON, DynamoDB checkpoints | 75 msg/s (75) | 79 msg/s (74) (比客户端 无法区分) | 77 msg/s (77) | 无法区分 |
AMD Ryzen 9 7900X 12-Core Processor, x86_64, 427-5912 MHz, 12 physical, 24 logical, 62.4 GiB, unknown, Linux 7.2.11-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-kinesis dynamodb-lease, ruststream macros,json. ruststream-kinesis 0.7.0, ruststream 0.7.0, 测量于 2026-10-18.
以表格显示数字
| 场景 | 指令数 | 内存分配 | 冷启动 |
|---|---|---|---|
| one shard, JSON decode into a small struct, ack each | 16,367.6 | 12.5 | 3,952,857 / 4,249 |
| one shard, reply with PutRecord through this crate's default policy | 368,050.9 | 395.6 | 4,236,029 / 4,579 |
| one shard, batches of 64, one read per batch | 21,572.3 | 18.3 | 4,028,415 / 4,310 |
机器
| 处理器 | AMD Ryzen 9 7900X 12-Core Processor |
|---|---|
| 架构 | x86_64 |
| 频率 | 427-5912 MHz |
| 核心数 | 12 physical, 24 logical |
| 内存 | 62.4 GiB |
| 内存速度 | unknown |
| 操作系统 | Linux 7.2.11-x64v3-xanmod1-1 |
| 模拟器 | localstack/localstack:4.14.0 (Kinesis and DynamoDB emulator) in Docker on localhost, not AWS |
| 往返时间 | 4.755 ms (DescribeStreamSummary, 2104 calls on one client) |
| 编译器 | 1.99.0 |
| 构建配置 | bench, inheriting release (opt-level = 3, lto = fat, codegen-units = 16, debug = line-tables-only) |
| 特性 | ruststream-kinesis dynamodb-lease, 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,由基准测试命令写入。方法论说明它们是怎样测得的,数字说明可以从中得出什么结论。