- https://github.com/facebook/rocksdb/wiki/Space-Tuning - 影响空间的主要因素: - block size - compression 算法 - compaction - 更改相关配置可能会对 CPU 使用、写放大产生副作用。 -------- # Compaction - compaction 是减少空间的最有效方式。 - leveled compaction 通常比 universal compaction 更节省空间。 - 对于两者最有效的参数分别是: - `options.max_bytes_for_level_multiplier` - `options.CompactionOptionsUniversal.max_size_amplification_percent` - 有时正常的 compaction 调度会留下垃圾,这时候可以借助选项 - `options.ttl` - `otpions.periodic_compaction_seconds` --------- # Block Size - 默认压缩前是 4 KB。推荐 16KB 更节省空间。 - 越大压缩效果越好,但解压时 CPU 的消耗就越高 - 特别是点查和 short range scans - 可以通过 perf context 的 `BLOCK_DECOMPRESS_TIME` 来观察 CPU 消耗 ## Index block - block size 变小会增加 index block 的大小。(索引项目变多了)。 - 如果 block cache 无法缓存 active index blocks,产生 cache miss,就需要解压 index block,造成性能变慢。 - 推荐 bloom filter 和 index block 的数据量小于 blcok cache,这样能缓存它们的大多数。 - 调优选项: - `index_block_restart_interval = 16` - 可以减少 index block 的数据量 (通常是节省 4 倍) - `enable_index_compression = false` - 增大了空间,但是如果 index block size 足够小,可以忽略 ---- # Compression Algorithm - 推荐 zstd 压缩算法(至少在 bottommost level)。不推荐使用 Zlib。 - 默认 ztd compression level 是 3,可调整的值为 1 到 19,可以在压缩速度和比率之间进行权衡。 ## Hybrid Compression - 不同 levels 配置不同的压缩算法。 - higher levels 推荐更快的算法,例如 LZ4 或者无压缩 - Lmax 推荐更强力的算法。 - 推荐:`compression_per_level=kLZ4Compression;bottommost_compression=kZSTD` ## Dictionary Compression - 字典压缩的效果依赖 数据特征、compression level 和 block size - 如果数据相似度很高,则效果很好。 - block size 太大,效果会变差