模拟Cache缓存

模拟缓存(SimCache)可以帮助用户预测块缓存性能指标, 例如在当前工作负载下特定模拟容量(内存)的命中、遗漏等,而不需要实际使用那么多内存。

动机

它能够帮助用户调整当前块缓存大小,并确定他们使用内存的效率。 此外,它还有助于理解高速存储的缓存性能。

介绍

SimCache的基本思想是使用一个配置了目标模拟能力的仅密钥块缓存来包装普通块缓存。 当插入发生时,我们将密钥插入到两个缓存中,但是值只插入到普通缓存中。 值的大小与两个缓存的容量有关,因此我们模拟具有模拟容量的块缓存的行为,而不使用那么多内存, 因为实际上,实际内存使用只包括键的总大小。

如何使用SimCache

因为SimCache是普通块缓存之上的包装器。用户必须先创建一个块缓存与NewLRUCache:(https://github.com/facebook/rocksdb/blob/master/include/rocksdb/cache.h)

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

将normal_block_cache包装为NewSimCache,并将SimCache设置为rocksdb::BlockBasedTableOptions的block_cache字段,然后生成options.table_factory:

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

最后,使用选项打开数据库。然后分别调用sim_cache->get_hit_counter()和sim_cache->get_miss_counter()来获取SimCache的HIT/MISS值。 或者,如果您不想存储sim_cache并使用Rocksdb (>= v4.12),那么您可以通过Tickers SIM_BLOCK_CACHE_HIT和SIM_BLOCK_CACHE_MISS在Rocksdb::statistics中获得这些统计信息。

内存开销

人们可能会关注SimCache的实际内存使用情况,可以估计为:

sim_capacity * entry_size / (entry_size + block_size)

  • 76 <= entry_size (key_size + other) <= 104,
  • 默认情况下BlockBasedTableOptions.block_size = 4096,但可配置

因此,默认情况下SimCache的实际内存开销在sim_capacity * 2%左右