Simulation Cache(SimCache)可以帮助用户在模拟的内存容量而不是物理上实际占用内存下预测block cache的性能数据,比如:hit、miss。
Motivation
帮助用户调优参数:block cache size、更高效地使用内存。另外,也可以帮助用户了解 fast storage的cache性能。
Introduction
SimCache的基本思想是根据要模拟的容量封装正常的block cache,但是这个封装后的block cache只有key,没有value。当插入数据时,把key插入到两个cache中,但是value只插入到normal cache。value的size会在两种cache中都计算进去,但是SimCache中因为只有key,所以并没有占用那么多的内存,但是以此却可以模拟block cache的一些行为。
How to use SimCache
由于SimCache是normal cache的封装,所以必须要先创建一个block cache。
std::shared_ptr<rocksdb::Cache> normal_block_cache =
NewLRUCache(1024 * 1024 * 1024 /* capacity 1GB */);
然后使用NewSimCache来封装normal_block_cache,将rocksdb::BlockBasedTableOptions的block cache变量设置为SimCache实例,然后生成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));
通过options配置来打开DB。通过调用sim_cache->get_hit_counter() and sim_cache->get_miss_counter()可以获取到SimCache的HIT/MISS。
Memory Overhead
用户可能会关注SimCache的实际内存占用,大致评估如下:
sim_capacity * entry_size / (entry_size + block_size),
- 76 <= entry_size (key_size + other) <= 104
- BlockBasedTableOptions.block_size = 4096 by default but is configurable
实际上,SimCache的实际内存开销大概是 sim_capacity * 2%