Skip to content

性能调优指南

本文是 Zeze 性能调优的参考——围绕缓存命中率、Checkpoint 策略、全局并发度、RocksDB 调优四大关键因素,给出指标目标、配置项与调优建议,并附基准量级与过载保护配置。表与缓存机制见 、线程模型见 线程模型与调度、全局缓存协调见 全局缓存管理器、嵌入式存储见 RocksDB、完整配置见 配置参考、上线调优见 上线清单

Zeze 的性能由四个关键因素决定:缓存命中率、Checkpoint 策略、全局并发度、RocksDB 调优。下面逐项展开。


1. 缓存命中率(最重要的指标)

Section titled “1. 缓存命中率(最重要的指标)”

缓存命中率是 Zeze 性能最重要的指标,目标应保持在 >99%

  • TableCache 的命中率直接决定是否回源数据库——命中即在内存完成,未命中则回源,开销骤增。
  • 配置 CacheCapacity:建议按预期在线人数 × CacheFactor(默认 5.0) 设置。getRealCacheCapacity() 实际生效容量为 floor(cacheCapacity * cacheFactor)
<TableConf CacheCapacity="200000" CacheFactor="5.0"/>
  • SoftReference + 本地 RocksDB:缓存 value 用 SoftReference 持有,并在本地保留一份 RocksDB 副本。这样内存容量与 value 大小无关——冷数据被 GC 回收后可从本地 RocksDB 恢复,而无需回源远端数据库。默认配置下基本不用专门调。

selectDirty 适合统计类查询(直接读脏数据,不走完整事务);whileCommit 可用于容忍短暂不一致的场景。


Checkpoint 决定脏数据多久落盘一次,影响持久化频率与吞吐。

配置项默认值说明
CheckpointPeriod60000(1 分钟)定时刷盘间隔
CheckpointModeTableTable(分布式必须用)/ Immediately(每事务立即,性能差,不建议)
CheckpointFlushModeMultiThreadMerge推荐,多线程合并刷,性能最优
CheckpointModeTableFlushSetCount50合并的事务数
CheckpointTransactionPeriod300000
  • Table + MultiThreadMerge 是分布式部署的推荐组合:周期性把一批事务的脏数据合并后多线程刷盘,摊薄了单次 IO 成本。
  • Immediately 模式每事务立即刷,性能极差,仅用于特殊场景。

3. 全局并发度(GlobalCacheManager)

Section titled “3. 全局并发度(GlobalCacheManager)”

启用 GlobalCacheManager 后,跨实例的数据共享会引入额外的网络往返,是分布式部署下主要的性能变量。详见 全局缓存管理器

操作网络往返说明
Share(读共享)1 次申请共享读
Modify(写)至少 2 次申请 + Reduce
Reduce 超时触发事务重试

优化方向

  • 热点分散:把集中在单一记录的写压力分散到多条记录/多个分片。
  • 减少跨实例 Modify:尽量让同一份数据的写操作落在同一实例,避免频繁的跨实例申请。

DatabaseRocksDb 是嵌入式存储,特点:

  • 无网络开销:数据在本地进程内,单机高性能。
  • 不支持 GlobalCacheManager:源码在创建 RocksDb 时会显式校验——若同时配置了 GlobalCacheManagerHostNameOrAddress 会直接抛异常:
case RocksDb:
if (!zeze.getConfig().getGlobalCacheManagerHostNameOrAddress().isBlank())
throw new IllegalStateException("RocksDb Can Not Work With GlobalCacheManager.");
  • 本地缓存 value:配合 SoftReference,GC 回收后从本地 RocksDB 恢复。详见 RocksDB

因此单机/嵌入式场景选 RocksDB(高性能、零网络),多实例共享场景才用关系库/TiKV + GlobalCacheManager。


配置项默认值说明
FastRedoWhenConflictfalse冲突时立即重做;开启可能增加 CPU 开销
  • 乐观锁机制下,冲突少时吞吐极高
  • 冲突多时事务会被重做。FastRedoWhenConflict=false 时按一定节奏重做;设为 true 则立即重做,减少延迟但可能放大 CPU 压力。

以下为 Zeze 内存路径相对于传统 SQL 的近似量级,供建立直觉(非精确承诺):

操作相对量级
内存 map 查询 vs SQL 查询快约 1000 倍
内存 map 更新 vs SQL update快约 1000 倍
默认每事务 flush 时,map 更新 vs SQL update快约 5000 倍

量级差异主要来自:内存操作 vs 网络往返 + 磁盘 IO;以及事务 flush 时批量提交摊薄了 IO。


配置项默认值说明
ProcedureStatisticsReportPeriod60000过程(Procedure)统计报告周期
TableStatisticsReportPeriod60000表统计报告周期

报告内容覆盖过程执行次数、冲突重做次数、平均耗时、表缓存命中率、记录数、脏记录等。结合 Prometheus 可做长期监控,详见 Prometheus 监控集成


配置项默认值说明
ProviderThreshold2000阈值,达到后开始限制
ProviderOverload4000过载,达到后更强力地拒绝/降级

上面的 2000 / 4000 即源码默认值(Config.javaproviderThreshold = 2000providerOverload = 4000)。建议生产环境显式配置,避免不同版本默认值调整带来意外。


配置项默认值说明
DeadLockBreakerPeriod60000死锁检测周期(Zeze.Util.DeadlockBreaker
ProcedureLockWatcherMin50锁等待监控阈值(分钟级,超过则告警)

死锁检测会主动打破成环的锁等待;锁等待监控用于发现长时间持锁/等锁的过程,定位性能瓶颈。


  1. 缓存命中率 >99%:调大 CacheCapacity,依赖 SoftReference + 本地 RocksDB。
  2. Checkpoint 用 Table + MultiThreadMerge:分布式必选,性能最优。
  3. 减少跨实例 Modify:分散热点,让写落在本地。
  4. 单机选 RocksDB:零网络开销;但不可与 GlobalCacheManager 共存。
  5. 冲突低时吞吐最高:必要时开 FastRedoWhenConflict 牺牲一点 CPU 换延迟。
  6. 配好过载保护与死锁检测ProviderThreshold/ProviderOverload/DeadLockBreakerPeriod