跳转至

模拟缓存(SimCache)可以帮助用户预测块缓存 在当前工作压力下,在一个特定的模拟(内存)大小下,的性能,比如,命中率,未命中率,而不用实际使用特定数量的内存。

动机

可以帮助用户调优块缓存大小,以及确定他们使用块缓存的效率。同事,帮助理解在高速存储下的缓存性能。

介绍

SimCache 的基本思想是,把普通的块缓存封装成一个使用目标模拟大小的,只有 key 的块缓存。当插入的时候,我们把 key 查到 cache,但是值只会插入到普通缓存。这样,值得大小就同事对两个缓存有影响,这样我们模拟了一个特定大小的块缓存的行为,而不需要使用实际的内存,实际内存使用只涉及 key 的总大小。

如何使用 SimCache

由于 SimCache 是一个普通块缓存的封装。用户需要使用 NewLRUCache 创建一个块缓存:

std::shared_ptr<rocksdb::Cache> normal_block_cache =
  NewLRUCache(1024 * 1024 * 1024 /* capacity 1GB */);

然后使用 NewSimCache 封装 normal_block_cache,然后把 SimCache 设置为 rocksdb::BlockBasedTableOptions 的 block_cache 字段,并且生成 options.table_factory:

rocksdb::Options options;
rocksdb::BlockBasedTableOptions bbt_opts;
std::shared_ptr<rocksdb::Cache> sim_cache = 
NewSimCache(normal_block_cache, 
  10 * 1024 * 1024 * 1024 /* sim_capacity 10GB */);
bbt_opts.block_cache = sim_cache;
options.table_factory.reset(new BlockBasedTableFactory(bbt_opts));

最后,使用该选项打开 DB。然后 SimCache 的 HIT/MISS 值可以分别通过 sim_cache->get_hit_counter() 和 sim_cache->get_miss_counter() 获得。可选的,如果你不希望存储 sim_cache,并且你的 Rocksdb 版本大于 v4.12,你可以通过 rocksdb::Statistic 滴答计数器 SIM_BLOCK_CACHE_HIT 和 SIM_BLOCK_CACHE_MISS 获取这些统计信息。

内存使用

人们可能会担心 SimCache 实际的内存使用,大概包括:

sim_capacity * entry_size / (entry_size + block_size),

  • 76 <= entry_size (key_size + other) <= 104
  • BlockBasedTableOptions.block_size = 4096。默认值,可配置

因此,默认 SimCache 的内存使用为 sim_capacity * 2%