Tag: ceph 12.2.4
BlueStore元数据结构
元数据Onode到硬盘映射关系
元数据
其中两个类型元数据:Collection和Onode:
- Collection,即PG在BlueStore内存管理结构,Collection数量有限常驻内存;Collection与PG一对一;
- Onode,即对象内存管理结构,无法将所有Onode常驻内存,结合淘汰算法进行缓存;Onode与对象一对一;
Collection通过OnodeSpace对应其归属的多个Onode,且存于BlueStore::coll_map结构,例:
[BlueStore.cc]
int BlueStore::_open_collections(int *errors)
>> KeyValueDB::Iterator it = db->get_iterator(PREFIX_COLL);
>> for (it->upper_bound(string()); it->valid(); it->next()):
CollectionRef c(new Collection(this, cache_shards[cid.hash_to_shard(cache_shards.size())], cid));
coll_map[cid] = c;
缓存
object对象数据存取到裸盘,涉及到实际数据bufferlist和元数据Onode;
实际数据通过Buffer结构(offset,len, bufferlist)进行缓存;
缓存Cache元素
- Onode,元数据,缓存机制LRU,利用单个链表实现,a)新数据插入到链表头部,b)缓存命中,则将数据移到链表头部;c)列表满,从链表尾部删除。
- Buffer,实际数据,缓存机制2Q,实现使用三个链表,buffer_hot、buffer_warm_in和buffer_warm_out。
Blob与实际数据联系
- 属性sharedblob指向SharedBlob,SharedBlob包含BufferSpace,BufferSpace通过内部buffer_map对应到Buffer;
- 属性blob通过PExtentVector(bluestore_pextent_t)记录实际数据到磁盘空间的映射;
Buffer状态
- STATE_EMPTY:Buffer无数据,若Cache类型为2Q,则表明对应Buffer已经淘汰,位于buffer_warm_out;
- STATE_CLEAN: Buffer数据与磁盘中数据一致;
- STATE_WRITING:Buffer数据正处于写状态,写操作完成,状态转换为STATE_CLEAN;
Buffer状态转换
Cache初始化
[OSD.cc]
int OSD::init()
>> store->set_cache_shards(get_num_op_shards());
[BlueStore.cc]
void BlueStore::set_cache_shards(unsigned num)
>> for (unsigned i = old; i < num; ++i):
cache_shards[i] = Cache::create(cct, cct->_conf->bluestore_cache_type, logger);
[注] bluestore_cache_type默认2q;
Onode缓存
[BlueStore.cc]
BlueStore::OnodeRef BlueStore::Collection::get_onode(const ghobject_t& oid, bool create)
>> OnodeRef o = onode_map.lookup(oid);
>> store->db->get(PREFIX_OBJ, key.c_str(), key.size(), &v);
>> on = new Onode(this, oid, key);
>> o.reset(on);
>> onode_map.add(oid, o);
[BlueStore.cc]
BlueStore::OnodeRef BlueStore::OnodeSpace::add(const ghobject_t& oid, OnodeRef o)
>> onode_map[oid] = o;
>> cache->_add_onode(o, 1);
[BlueStore.h]
void _add_onode(OnodeRef& o, int level) override
>> if (level > 0): onode_lru.push_front(*o);
>> else: onode_lru.push_back(*o);
Buffer缓存
写后缓存
[BlueStore.cc]
void BlueStore::_txc_finish(TransContext *txc)
>> sb->bc.finish_write(sb->get_cache(), txc->seq);
[BlueStore.cc]
void BlueStore::BufferSpace::finish_write(Cache* cache, uint64_t seq)
>> b->state = Buffer::STATE_CLEAN;
>> b->data.reassign_to_mempool(mempool::mempool_bluestore_cache_data);
>> cache->_add_buffer(b, 1, nullptr);
读后缓存
[BlueStore.cc]
int BlueStore::_do_read(Collection *c, OnodeRef o, uint64_t offset, size_t length,
bufferlist& bl, uint32_t op_flags)
>> if (buffered):
bptr->shared_blob->bc.did_read(bptr->shared_blob->get_cache(), 0, raw_bl);
[BlueStore.h]
void did_read(Cache* cache, uint32_t offset, bufferlist& bl)
>> Buffer *b = new Buffer(this, Buffer::STATE_CLEAN, 0, offset, bl);
>> _add_buffer(cache, b, 1, nullptr);
另外,mempool统计对应池内存使用情况,如cache关联的bluestore_cache_data、bluestore_cache_onode和bluestore_cache_other。