跳到主要内容
英文版本为准

本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。

基准测试

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. 这些数字是怎样测得的

one shard, 512 B JSON, in-process checkpoints
  • 无法区分
  • 无法区分
one shard, 512 B JSON, DynamoDB checkpoints
  • 无法区分
  • 无法区分
以表格显示数字
场景裸客户端Broker crateRustStream额外开销
one shard, 512 B JSON, in-process checkpoints358 msg/s (342)363 msg/s (346) (比客户端 无法区分)365 msg/s (340)无法区分
one shard, 512 B JSON, DynamoDB checkpoints75 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
one shard, reply with PutRecord through this crate's default policy
368,050.9
395.6
one shard, batches of 64, one read per batch
21,572.3
18.3
以表格显示数字
场景指令数内存分配冷启动
one shard, JSON decode into a small struct, ack each16,367.612.53,952,857 / 4,249
one shard, reply with PutRecord through this crate's default policy368,050.9395.64,236,029 / 4,579
one shard, batches of 64, one read per batch21,572.318.34,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
RUSTFLAGSnone (the recipe clears RUSTFLAGS, so the numbers are not tied to this CPU)
Valgrind3.25.1

数字来自本版本的 docs/benchmarks/results.json,由基准测试命令写入。方法论说明它们是怎样测得的,数字说明可以从中得出什么结论。