展示 HN: Keybench – 可脚本化、可扩展的键值存储性能工具
keybench ======== 一个可脚本化、可扩展的键值存储性能工具。你将工作负载用 Lua 编写。keybench 在一个或多个存储引擎之间驱动它,计时每个操作,并报告吞吐量和延迟。相同的脚本在每个引擎上无变化地运行,因此比较测量的是引擎而不是工具架。它测量的内容 ================ keybench 报告两个速率和一个延迟分布。wu/s 每秒工作负载单位。一个单位是对你的 run() 函数的一次调用。这是整个操作的速率,由你的脚本定义,比如“查看购物车”或“结账”,与每个操作需要多少次键触摸无关。ops/s 原始操作每秒。一个原始操作是一次 put、get、del、range、或 scan 调用,或在一个 mget、mput 或 mdel 中处理的一个键。一个范围或扫描的计数无论返回多少行都算作一次。这是原始键触摸的速率。当每个单位是一个原始操作时,这两个速率是相等的,报告打印一条吞吐量行。当一个单位执行多个原始操作时,例如一批 B 个键或一个扫描并删除后结账的购物车,报告将在单独的行上打印 wu/sec 和 ops/sec。对于批量动词 ops/sec 正好是 B 倍的 wu/sec,因为每个单位执行 B 次键触摸,因此批量操作显示为 ops/sec 随 B 上升,而 wu/sec 下降,差异是每次调用的固定成本分摊至更多键。延迟按操作类型记录为分布,而不是平均值。每个 put、get、del、range、mget、mput 和 mdel 都有自己的直方图,扫描时间被记录到范围直方图。报告提供 p50、p99、p99.9 和每个的最大值。它是如何工作的 ============ 五个部分,每个部分可替换。引擎拥有并发性。keybench 生成工作线程,将操作预算分配给它们,并将它们合并。一个工作线程在其自己的 Lua 状态中运行你的脚本,使用自己随机种子。工具架在引擎调用时永远不会持有锁,因此序列化的引擎报告为序列化,而并行的引擎报告为并行。Lua 脚本保持单线程,且从不考虑锁。工作负载是一个 Lua 表。一个文件返回一个包含名称、可选加载函数和运行函数的表。load 在计时之前对存储进行播种,工具架在每个工作线程上同时运行它,每个线程填充自己的分片,因此大型数据集并行加载。run 是测量的单位,工具架调用它直到操作预算或时间预算耗尽。两个都接收一个 ctx 表,携带用户、项目、操作、种子、批量、线程、线程和当前迭代。存储是每个引擎的一组动词。你的脚本调用一个全局 kv 表。这八个动词可以访问任何选定引擎。keybench 计时调用,将样本文件在正确的直方图中,并计算原始操作。后端是一个自注册插件。每个引擎都在 backends/ 下,有自己的构建片段,并在 main 运行之前注册自己。通过名称选择一个或几个进行比较,是一个命令标志。添加一个是一个新的目录和虚表,不需要编辑核心。报告者是一个汇聚器。运行广播其元数据、探针、聚合点和每个报告者要求的实时样本。控制台报告者打印人类可读的报告。tsv 报告者写机器行。时间线报告者为每个实时样本写一行。你可以同时运行多个报告者。构建 ======== keybench 自带 Lua,因此默认构建只需要一个 C 编译器和 pthreads。make 这将生成 ./keybench,内存中的跳表引擎被编译进来。跳表不需要外部库,是参考引擎。要编译持久引擎,命名它们。make ROCKSDB=1 添加 RocksDB 引擎 make TIDESDB=1 添加 TidesDB 引擎 make BACKENDS="skiplist rocksdb tidesdb" 默认不链接特殊分配器,keybench 使用系统分配器。如果一个发行版的 rocksdb 或 tidesdb 是用 jemalloc 构建的,首先将相同的分配器链接上 ALLOC=jemalloc,以便整个 malloc 系列一致,从而避免在跨清扫点重新打开数据库时崩溃。ALLOC=tcmalloc 也可以,ALLOC_LIBS="..." 可以链接其他分配器或自定义路径。引擎库和头文件位置也可以重写,因此自定义安装可以工作。make ROCKSDB=1 ROCKSDB_CFLAGS=-I/opt/rocksdb/include ROCKSDB_LIBS="-L/opt/rocksdb/lib -lrocksdb" make TIDESDB=1 TIDESDB_CFLAGS=-I/opt/tidesdb/include TIDESDB_LIBS="-L/opt/tidesdb/lib -ltidesdb" make ROCKSDB=1 TIDESDB=1 ALLOC=jemalloc 要使用系统 Lua 而不是自带的副本构建。make LUA_SYS=1 其他目标。make run 构建,然后运行一次购物车工作负载 make all-wl 构建,然后运行 workloads/ 中的每个工作负载 make clean 运行 ======= 最小的运行命名一个工作负载文件。 ./keybench workloads/mixed.lua 默认情况下,这将驱动 200000 单位在一个线程上对跳表进行测试,并打印控制台报告。该报告的形状。keybench 0.1.0: 1 个工作负载,引擎=跳表
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡