Table of Contents

Log(EntryLog)性能基线

现行版 Log 独有压测报表(首建——旧架构基准套件 §4 Log 数字出自旧 Structures/{Index,Log,Ring} 40 文件套件(旧 API 形态),随缺口收尾清理,已过时。注:Log 非泛型——entry 为原始字节流, 无 key 类型参数)。数字实测于本机 (i5-12400 / .NET 8.0.30 / x64 RyuJit AVX2),文件系统=内存文件系统(写路径纯 CPU 口径,引擎 IO 噪声为零; 本地文件系统另行对照)。

配置

  • EntryLog(PageSize=8K / Managed meta / 组提交默认策略——字节量/条数/时间间隔三维阈值自动落盘)
  • entry 64B;count 50 万;批变体 512/批
  • 运行:
    dotnet run -c Release --project benchmarks/TC.Tier.Runtime.Benchmarks -- --log-write-probe 500000 64
    

数字

变体 吞吐 备注
single(单条 Append) 1.34M op/s(~745ns/op) 并发安全化(写路径粗锁):相对旧无锁版 1.38M -3%(Monitor 快速路径 ~20ns/entry)——单写者语义完全保持(水位零改动)
batch(BeginAppendBatch 512) 5.49M op/s(~182ns/op) 批持锁(Begin/Dispose 各一次)——批内本地游标零锁——与旧版 5.4M 持平
concurrent(8 写者并发 Append) ~2.1M op/s 锁竞争下吞吐(正确性确定——串行语义);并发价值 = API 契约安全(public Append 多线程调用不损坏),非吞吐扩展
recovery(50 万条重开) 9 ms 页帧扫盘 + meta 水位恢复

对照(同机同形,mem)

Log Ring 判定
单条写 720ns 906ns(lock 分配) Log 略快(单写者无锁)
批量写 5.40M op/s 6.07M op/s(8 写者批窗口) 同量级
恢复 9ms/50 万 45-60ms 底盘 Log 快一个量级(无索引重建)

结论

  • 并发安全已交付(终案——写路径粗锁):public Append/Flush/TruncateSuffix 多线程并发调用 安全(串行化——不损坏);API 契约对齐 Ring。代价 = 单写者 -3%(Monitor 快速路径)、批持平 (批持锁摊薄)——最小损失方案
  • 模型选型(最终方案):窗口模型(双页 ping-pong 强套并发——页状态机/原子段分配/ 换页仲裁)存在未定位的偶发失败且负优化(-29%/-64%),未采用;每写者页缓冲(写者零共享)适配面大(水位/ TailAddress/TruncateSuffix 是单写者语义深度耦合——并发化需全面语义改造),未采用;粗锁(单写者语义保持、 水位零改动、零新竞态面)为最终方案——并发安全以正确性确定为前提,不以吞吐扩展为目标
  • 全量 855 绿 ×6 连过。

维护

  • 改动 Log 写路径(Append/页缓冲/flush/组提交)后必须重跑本探针并更新数字(性能论断须实测)。