??Simulation Cache(SimCache)可以幫助用戶在模擬的內(nèi)存容量而不是物理上實際占用內(nèi)存下預(yù)測block cache的性能數(shù)據(jù)屎开,比如:hit栏妖、miss。
Motivation
??幫助用戶調(diào)優(yōu)參數(shù):block cache size骑篙、更高效地使用內(nèi)存伪货。另外惨奕,也可以幫助用戶了解 fast storage的cache性能字支。
Introduction
??SimCache的基本思想是根據(jù)要模擬的容量封裝正常的block cache缎患,但是這個封裝后的block cache只有key鸦概,沒有value箩张。當(dāng)插入數(shù)據(jù)時甩骏,把key插入到兩個cache中,但是value只插入到normal cache先慷。value的size會在兩種cache中都計算進去饮笛,但是SimCache中因為只有key,所以并沒有占用那么多的內(nèi)存论熙,但是以此卻可以模擬block cache的一些行為福青。
How to use SimCache
??由于SimCache是normal cache的封裝,所以必須要先創(chuàng)建一個block cache脓诡。
std::shared_ptr<rocksdb::Cache> normal_block_cache =
NewLRUCache(1024 * 1024 * 1024 /* capacity 1GB */);
然后使用NewSimCache來封裝normal_block_cache无午,將rocksdb::BlockBasedTableOptions的block cache變量設(shè)置為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宪迟。通過調(diào)用sim_cache->get_hit_counter() and sim_cache->get_miss_counter()可以獲取到SimCache的HIT/MISS。
Memory Overhead
用戶可能會關(guān)注SimCache的實際內(nèi)存占用交惯,大致評估如下:
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的實際內(nèi)存開銷大概是 sim_capacity * 2%