- 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 太大,效果会变差