RocksDB统计指标疑问:两种KV存储实现的统计异常分析
RocksDB 指标异常问题分析与解决方案
问题1:无用户读操作但block cache miss高,读指标为0
rocksdb.block.cache.miss 并不只统计用户通过db.get发起的读请求,RocksDB后台线程的操作也会触发block cache访问,且这类操作不会计入用户层面的rocksdb.number.keys.read和rocksdb.bytes.read:
- 后台Compaction:当RocksDB执行compaction合并SST文件时,需要读取底层SST的索引块、数据块,若这些块不在block cache中,就会产生miss。这是最常见的原因。
- 后台元数据操作:比如SST文件的元数据扫描、校验等,也可能触发block cache的访问。
你可以通过查看rocksdb.compaction.count指标确认compaction的触发次数,以此验证是否是compaction导致的block cache miss。
问题2:有读操作但memtable hit有值,block cache miss为0
RocksDB的读路径优先级是:先查活跃memtable,再查immutable memtable,最后才会读取磁盘上的SST文件(此时才会访问block cache)。出现这种情况说明:
- 所有读请求的键都存在于memtable或immutable memtable中,完全没有触发磁盘SST的读取,自然不会产生block cache的访问(包括miss)。
- 可能是测试数据量过小,所有数据都还驻留在内存中;或者读的都是最近写入、还未被刷入SST的键。
技术建议
针对问题1
- 检查compaction配置(如
level_compaction_dynamic_level_bytes、write_buffer_size等),判断是否触发了频繁的compaction。 - 若不需要频繁compaction,可以调整写缓冲大小或compaction触发阈值,减少后台块读取操作。
针对问题2
- 查看
rocksdb.flush.count、rocksdb.memtable.size指标,确认数据是否已被刷入SST。 - 增加测试数据量,或主动调用
db.flush()触发memtable刷盘,之后再执行读操作,观察block cache指标的变化。
内容的提问来源于stack exchange,提问作者Awani
相关产品推荐
相关产品推荐

