Table of Contents

Structures 性能基线(七子体系全景)

环境口径(★三机数字绝对值不可比,只看各自机内相对结论)

环境 机器 文件系统 覆盖章节
A Windows 10,i7-10510U 4c/8t,SATA SSD 真盘 DIO/Buffered §2 Ring、§4 Log(Win 列)、§5 vs FASTER
B i5-12400,内存文件系统(引擎 IO 噪声为零) 内存 §3 索引+组合(细账见 kv-composition.md
C Ubuntu 24.04,Ryzen 9 6900HX 12c,NVMe 真盘 DIO §4 Log(Linux 列)

引擎底盘(lease/段表/CAS 原语)基线另见 storage-engine-perf-baseline.md; KV 组合完整细账见 kv-composition.md,本文收口全子体系。 BDN artifact 落 bm-results/——数字进文档必须能溯源(methodology 规范)。


1. 基准清单(benchmarks/TC.Tier.Runtime.Benchmarks)

现役(当前架构,持续维护):

文件 测什么
Kv KvCompositionBench / KvRecoveryBench 组合点查/写、恢复(全量重放 vs 镜像载像)
Kv FasterHotReadBench FASTER 同形热读四变体对照(含 94.67ns 批口径)
Kv MirrorProbe / ReplayAllocProbe(探针) 镜像恢复阶段分解 / 重放·写路径分配分解
Storage 引擎/段表/lease 基准 见 storage-engine-perf-baseline.md
dotnet run -c Release --project benchmarks/TC.Tier.Runtime.Benchmarks -- --filter "*KvComposition*"
dotnet run -c Release --project benchmarks/TC.Tier.Runtime.Benchmarks -- --filter "*KvRecovery*"
# 探针:--replay-alloc-probe / --mirror-probe

口径说明:当前架构的索引/Ring 基准面 = Kv 组合套件(§3);需要单族微基准时按 KvCompositionBench 形态新写。


2. Ring(环境 A,2026-08-02)

2.1 写吞吐与延迟

数字 备注
稳态写 1M ops 1.86M ops/s 较旧基线 +95%
长稳 10M ops 2.01M ops/s GC 0/0/0;CPU mean 14.6%、RSS 24MB
4KB record 写 512-625 MB/s 打满 SATA 带宽;256B 490 MB/s
写延迟 64B 192ns / 256B 299ns / 1KB 711ns / 4KB 5.7µs
并发写 1T 370K → 2T 986K(2.7×)→ 4T 1.32M(3.6×)→ 8T 745K 8T 回落=4 核硬件上限;p99 < 3.2µs

2.2 读

数字 备注
GetRecord 热路径 10.5ns(Buffered)/ 11.7ns(DIO) 优化前 22.6ns(2.2×)
冷页读(64KB 页) 26.7µs vs 热 38.9ns 冷热差 ~700×——真实性能由冷读决定
32MB 页冷 17.2ms 页越大冷读越贵(回源粒度)
1MB 页冷读 DIO 413µs ≈ 热读 Buffered 376µs 大页下冷热接近
部分页冷(ColdReadRatio=0) AllCold 58.7µs vs 默认 0.25 的 232.5µs 页内未填充区回源概率旋钮生效

2.3 溢出(WiscKey 形态)与恢复

数字
内联值 1.36µs
溢出值 59.7-63.8µs(独立溢出引擎读)
Managed meta O(1) 恢复 9→7→11ms(100MB→1GB 恒定)
Embedded 倒扫恢复 6→7→133ms(1GB 从 1076ms 优化到 133ms)
1GB 写入 1.5-2.0s(旧 4.8s,~2×)

3. 索引 + KV 组合(环境 B,2026-08-22;细账 kv-composition.md)

3.1 点查(index.Find + Ring.GetValue 两段合口径,100k 热区乱序)

索引族 Mean 备注
Hash 161 ns 零分配;容量自适应附带红利(旧 191-222ns)
BTree ~350 ns 零分配;扁平缓存+引擎读快路径+生长模式三段累计 5.3×(基线 1.93µs)
SkipList ~816-850 ns 零分配;arena 化(旧 2.22µs,~2.2×),工作集 28.8→6.5MB 全 L3

写(含每迭代全新组合装配冷启动口径):Hash 2.9-3.6µs / BTree 5.6-24.9µs(分配列跨线程归属 同线程探针 621B/插)/ SkipList 3.8-4.6µs(363B/插,arena 零托管税)。

3.2 vs FASTER 同形热读(FasterHotReadBench 四变体,同机同轮)

变体 ns/op
FASTER 2.6.5 session.Read(100k×8B key+64B struct) 126.96
本组合逐次 Find+GetValue 158.2(1.25×)
scoped+span 逐次 167.9(勿用——每迭代 4 次 epoch 转换不划算)
scoped+span 批量(256 查/invocation) 94.67(0.75×)——反超 FASTER 1.34× 并破百

批量反超来源:零拷贝(FASTER 付 64B 出参拷贝)+ 无逐 op session 机器 + epoch 摊薄。 FASTER 单线程随机热读在本机真实水位 = 133.4ns(逐次口径对照 158.4ns,差 1.19×/25ns)。

3.3 恢复(跨实例重开 + 50k 条)

索引族 全量重放 镜像载像(零增量)
Hash 67-87 ms 64.7 ms
BTree 106-130 ms 58.7 ms(2.2×)
SkipList 93-132 ms 49.0 ms(2.1×)

镜像真收益 = W 距尾近的增量场景(重放量 ∝ 距尾距离,非数据总量);Hash 全量重放分配已压到 2.7MB(54B/条,-98.4%)(容量自适应,旧 167.9MB 构造期常量)。

3.4 组合分解(Stopwatch 探针,100k 稳态,Hash 组合)

Ring.Write ~906ns | HashIndex.Insert ~904ns | Ring.GetValue ~74ns。


4. Log(环境 A Win / 环境 C Linux)

4.1 写吞吐(EntryLog 4KB payload 攒页)

配置 Win (A) Linux (C)
DIO+WriteThrough 4M(生产推荐) 590 MB/s 1,469 MB/s
DIO+WT 1M 520 MB/s 1,071 MB/s
DIO+None 4M 630 MB/s
达磁盘裸写 69% 61%

损耗 31-39% = CRC32C + 帧组帧 + padding。Log 攒页比引擎逐条 Append 快 6.8×(Buf+None)/ 33.8× (Buf+WT)——攒页摊薄 lease+CAS+syscall。

4.2 小 payload WAL(DIO+WT 4M,真实业务形态)

payload 模式 ops/s p50 p99 p999
128B 攒页 903K 0.4µs 1.2µs 15µs
128B 默认 gc(10ms) 348K 0.4µs 0.6µs 603µs
128B 单条强制 2,172 375µs 1,041µs 1,489µs

攒页 vs 单条强制 = 416×(group commit 用崩溃窗口换吞吐);WAL 尾延迟 SLA 以默认 gc 的 p999(~1ms)为预算基线。写放大:128B 1.125× / 4KB 1.004×;fsync/MB:攒页 1 次 vs 单条 4,096 次。

4.3 回放 / 恢复 / 截断 / 提交

数字 备注
回放(128B 无 CRC) 10.96M entries/s(1,338 MB/s) CRC 开关 ~2× 差(128B+CRC 3.56M/s)
回放冷读(DIO,= 崩溃重启场景) 4KB 冷热比 0.99-1.10×;128B+CRC 冷读 +35%(仍 <0.4µs/条) 恢复回放不构成瓶颈
恢复(meta Miss 二分定位) 4MB 47ms → 64MB 60ms O(log N):数据 16× 恢复仅 +28%
CommitAsync 显式提交 ~1.4-2.2ms(三 meta 策略同量级) 受限同一次数据 flush;事务 SLA 预算 ~2ms
TruncatePrefix ~1ms(纯打洞)→ 8.1ms(1GB 删 8 段+打洞) 字节级物理销毁实测;与 Append 完全并行
10 分钟长稳 avg 102.5 MB/s / 42 万 ops/s;p99=2.4µs、p999=788µs(周期 flush 尖峰) Gen2 仅 3 次;RSS 稳定 29MB 净增 0

4.4 并发(Channel 单写线程模型)

1/2/4/8 生产者吞吐 172K-205K ops/s 稳定,p99 全部 ≤1.3µs——单写线程串行化消除锁竞争尾延迟, p999 周期尖峰(470-810µs)与 group commit flush 同源。


5. 全套 KV vs FASTER(环境 A,2026-08-04,TierKvVsFasterBench / FasterHotReadBench)

场景 本方 FASTER 倍数
热区点查 KeyOnly(16B,预存 addr) 4.4ns 61.8ns ~7×(口径含预存地址,FASTER 每次过 hash)
热区点查 ValueOnly / KeyValue 5.2 / 8.7ns
冷区点查 14.7µs 63.4µs ~4×
扫描 L1 raw byte(10k 条) 0.95ns/条 无此能力 地址流裸读形态
扫描 L2 地址流 / L3 key(+value) 23.9 / 28.9-29.0ns 15.7ns 默认顺序游标慢于 FASTER 内置 scan——批形态见 §3.2
值上限 Segment 1GB + overflow record ≤ PageSize(不跨页) 架构差异

架构面:地址一等公民可缓存复用跳 hash(FASTER 地址 internal 锁死);游标可注入。 冷读是热读的 ~2800×——真实性能由冷读决定。


6. Metadata / Mirror / Snapshot

  • meta 三策略 CommitAsync:Disabled/Embedded/Managed 均 ~1.4-2.2ms(§4.3 表),策略差异在 噪声内——meta 开销不构成提交瓶颈;Recover:Embedded≈Disabled(同页扫)< Managed(+meta 引擎重开 ~20-40ms)。
  • 镜像恢复底盘(环境 B):零增量载像 49-65ms 封顶于恢复共同底盘(主/镜像双引擎重开+载像 IO)。
  • Snapshot:无专属基准(测试覆盖 12 例);帧 IO 量级与 Log 回放同形(§4.3 冷读结论适用)。