bluestore的空閒塊管理

2021-08-19 15:01:37 字數 2103 閱讀 9136

bluestore自己管理裸盤的塊裝置,管理空閒空間的類是freelistmanager,所有的塊組成乙個bitmap,0為空閒,1為使用。

freelistmanager *freelistmanager::create(

cephcontext* cct,

string type,

keyvaluedb *kvdb,

string prefix)

從freelistmanager 的create函式可以看出目前空閒list只能由bitmapfreelistmanager 來管理,也就是說type只能是bitmap,否則會返回null

int bitmapfreelistmanager::create(uint64_t new_size, uint64_t min_alloc_size,

keyvaluedb::transaction txn)

dout(10) << __func__

<< " size 0x" << std::hex << size

<< " bytes_per_block 0x" << bytes_per_block

<< " blocks 0x" << blocks

<< " blocks_per_key 0x" << blocks_per_key

<< std::dec << dendl;

return 0;

}從bitmapfreelistmanager的create函式可以看出,塊裝置的元資料是用kv儲存的,預設有四個key,分別是bytes_per_block/blocks_per_key

/blocks/size

bitmapfreelistmanager 提供的申請塊裝置和釋放塊裝置的函式分別如下:可以看到無論申請還是釋放 都是通過xor來進行的

void bitmapfreelistmanager::allocate(

uint64_t offset, uint64_t length,

keyvaluedb::transaction txn)

void bitmapfreelistmanager::release(

uint64_t offset, uint64_t length,

keyvaluedb::transaction txn)

我們看看xor的實現

在xor中會針對申請的塊裝置的起始位址和size 來判斷要申請的塊裝置屬於哪個塊裝置組

我們這裡以最簡單的case為例,即要申請的塊裝置在同乙個組內

void bitmapfreelistmanager::_xor(

uint64_t offset, uint64_t length,

keyvaluedb::transaction txn)

string k;

make_offset_key(first_key, &k);

bufferlist bl;

dout(30) << __func__ << " 0x" << std::hex << first_key << std::dec << ": ";

bl.hexdump(*_dout, false);

*_dout << dendl;

#這裡的merge操作也是xor操作,表示和目前的value 來xor操作

txn->merge(bitmap_prefix, k, bl);

} else

從下面這個函式知道merge操作其實是呼叫xormergeoperator 來進行的

void bitmapfreelistmanager::setup_merge_operator(keyvaluedb *db, string prefix)

而xormergeoperator 的merge操作如下:可以看到也是進行xor操作

struct xormergeoperator : public keyvaluedb::mergeoperator

void merge(

const char *ldata, size_t llen,

const char *rdata, size_t rlen,

std::string *new_value) override

} }

空閒記憶體管理

學習自 現代作業系統 作業系統在動態分配記憶體時 malloc,new 需要對空間記憶體進行管理。一般採用了兩種方式 點陣圖和空間鍊錶。1 使用點陣圖的儲存管理 記憶體被劃分為若干個幾位元組大小的分配單元,每個分配單元是否是空閒的情況採用點陣圖來進行描述,如果已分配,相應位置1,未分配,置0。當需要...

作業系統的空閒記憶體管理

動態分配記憶體時,作業系統必須對空閒記憶體進行管理。使用點陣圖時,記憶體可能被劃分為很多個分配單元,每個分配單元對應點陣圖中的一位,0 表示空閒,1 表示占用。使用點陣圖時,關鍵問題在於分配單元大小的設計。分配單元越小,越可以精細分配記憶體。但這也意味著點陣圖越大,消耗的空間越大。使用鍊錶時,鍊錶中...

管理資料塊空間

使用資料塊引數 1.建立物件時指定快空間引數 當建立物件時,可以使用所有塊空間引數 當建立索引時,只能設定桉樹pctfree和initrans,而不能指定pctused引數。create cluster dept emp clu deptno number 3 pctfree 20 pctused ...