塊存儲(chǔ) 資源管理
由IO路徑看資源布局。
IO start
Volume層
Pool層
Thin LUN
Meta Volume
-
Root Extent
- Alloc Queue
- Free Queue
- Map Tree Root
- Free Tree Root
Data Volume
Alloc Queue
grain分配隊(duì)列
使用場(chǎng)景:
寫thin lun,在查詢map tree對(duì)應(yīng)grain未分配時(shí)觸發(fā)空間分配扫夜;
step1:空間以順序分配的方式進(jìn)行琳要,分配時(shí)隙笆,增加offset偏移并可能改變隊(duì)首(對(duì)首Item全部分配完時(shí))魏保,并生成grain info返回鲜侥。
step2:在map tree中插入新的映射項(xiàng)(grain id -> Extent ID + offset),如果和前一個(gè)node滿足合并條件則合并天揖。
step3:如果alloc queue中可分配的grain低于閾值夺欲,則觸發(fā)后臺(tái)空間分配,首先從SPA中獲取Extent并生成Item插入alloc queue隊(duì)尾今膊,如果SPA空間不足些阅,不能分配Extent,則從free tree中取出Item斑唬,直接插入到alloc queue市埋。
Item Head
Tier:0,1恕刘,2(為0時(shí)缤谎,一個(gè)bit表示一個(gè)grain,每升1褐着,乘以64)
Offset:記錄Extent已經(jīng)分配grain的偏移坷澡。
Bitmap:0xFFFFFFFFFFFFFFFF(64字節(jié))
Item
Item
...
Item Tail
Item
結(jié)構(gòu)
-
Extent ID
表示歸屬的Extent ID
-
Tier
多級(jí)位圖結(jié)構(gòu)
0:bitmap一個(gè)bit表示一個(gè)grain的分配情況;
1:bitmap一個(gè)bit表示64個(gè)grain的分配情況含蓉;
2:bitmap一個(gè)bit表示64*64個(gè)grain的分配情況频敛;
以此類推项郊;
-
Offset
grain的分配采用順序分配的方式
Tier為0時(shí),bitmap的置位便可表示每個(gè)grain的分配情況斟赚;
Tier為1時(shí)着降,bitmap中為置為1的bit表示相應(yīng)64個(gè)grain均已分配。不存在64個(gè)grain部分分配拗军,tier卻為1的情況鹊碍,未集滿時(shí)tier不會(huì)提升。此時(shí)bitmap的置位不能表示每個(gè)grain的分配情況食绿,需要offset配合侈咕,每次分配一個(gè)grain,offset++器紧,遇到已經(jīng)置位的bit耀销,還需++64;
Tier為2時(shí)铲汪,同上熊尉;
-
Bitmap
0xffffffffffffffff(8字節(jié))
對(duì)應(yīng)不同的tier,每個(gè)bit置位表示不同數(shù)量的grain分配情況掌腰,1狰住、64、64*64...
合并
歸屬于相同的Extent齿梁,且表示的grain范圍相同的Item可以合并催植。
tier為0的item,集滿64個(gè)bit后勺择,tier提升為1创南,并根據(jù)offset將新的item對(duì)應(yīng)位置的1個(gè)bit置位;
tier為1的item省核,集滿64*64個(gè)bit后稿辙,tier提升為2,并根據(jù)offset將新的item對(duì)應(yīng)位置的1個(gè)bit置位气忠;
以此類推邻储;
分配
Grain Free Tree
資源釋放樹
使用場(chǎng)景:
刪除thin lun,去激活快照等操作旧噪,需要釋放響應(yīng)的grain空間吨娜,本樹中記錄了已經(jīng)釋放的grain,釋放的grain從map tree摘下放到free queue舌菜,free queue將隊(duì)列中同一個(gè)extent的grain合并到一個(gè)item萌壳,最終和free tree的item合并,當(dāng)item集滿整個(gè)Extent時(shí),將Extent釋放給SPA袱瓮。
node
-
leaf node
- key:extent id
- value:item
leaf node
leaf node...
node
node...
Grain Map Tree
thin lun的空間分配樹缤骨。
使用場(chǎng)景:
1.寫thin lun時(shí),查詢本樹相應(yīng)grain是否分配尺借,未分配時(shí)從alloc queue分配grain并在本樹插入相應(yīng)node绊起。
2.刪lun、去激活快照等燎斩,需要回收空間虱歪,需要查詢并刪除本樹的節(jié)點(diǎn),同時(shí)查詢free t栅表,如果free queue已經(jīng)存在 相同的Extent的Item笋鄙,將相應(yīng)grain的offset bit置位,否則生成新的Item插入free queue的隊(duì)尾怪瓶。
node
-
leaf node
相鄰的node萧落,如果屬于同一個(gè)Extent,且Grain ID也相鄰洗贰,則合并為一個(gè)leaf node以節(jié)省空間找岖。
在對(duì)Thin LUN做連續(xù)寫時(shí),從分配隊(duì)列分配的grain很可能滿足合并條件(在資源充足敛滋,從SPA分配到整個(gè)Extent時(shí)许布,連續(xù)寫分配的Grain必然可以合并;未從SPA分配到Extent時(shí)绎晃,去Free Tree取出Item分配蜜唾,這里由于釋放grain時(shí)的隨機(jī)性,能合并的可能較谢选)灵妨。
由于存在合并的情況,使用grain id來(lái)map tree查詢時(shí)落竹,可能響應(yīng)的grain已經(jīng)和前面的node合并,所以查詢策略略有不同货抄,未查詢到時(shí)述召,還需要查詢前面的node中value的范圍是否包含了查詢的grain。
- key:LBA/grain size
- value:Extent Id + offset
- leaf node
- leaf node...
node
node...
Ckg Map Tree
POOL的CKG映射樹(ckg id -> disk + lba)
負(fù)責(zé)ckg id到盤的路由
node
-
leaf node
- key:ckg id
- value:chunks{(diskid,LBA),...}
leaf node...
node
node...
Extent Map Tree
LUN的空間映射樹(extent id -> ckg id)
該樹負(fù)責(zé)extent到ckg的路由蟹地,由pool管理积暖,物理分布在root extent中,節(jié)點(diǎn)有nodeMgr分配在非預(yù)留的extent node上怪与。
讀寫:通過(guò)extent id進(jìn)行索引夺刑,查到樹上存在對(duì)應(yīng)的節(jié)點(diǎn),獲取ckg id和offset,到pool的ckg map tree上進(jìn)一步查詢遍愿;
node
-
leaf node
- key:extent id
- value:ckg id + offset
leaf node
leaf node...
node
...
node
Free Queue
grain空間釋放隊(duì)列
使用場(chǎng)景:
刪lun或去激活快照時(shí)存淫,觸發(fā)空間釋放;
step1:將grain id的映射信息從map tree中摘下沼填,并可能導(dǎo)致map tree node分裂(之前相鄰的node滿足屬于同一個(gè)Extent且grain id連續(xù))桅咆。
step2:以釋放的grain的Extent id + offset去free queue查找,若找到坞笙,將相應(yīng)bit置位岩饼,否則,生成新的Item插入隊(duì)尾薛夜。
step3:后臺(tái)釋放:遍歷free queue籍茧,將同一個(gè)extent的Item合并。
step4:將合并的Item去free tree查找梯澜,找到對(duì)應(yīng)項(xiàng)則合并寞冯,否則新插入Item,若合并后Item集滿整個(gè)Extent腊徙,將Extent釋放給SPA简十。
Question:step2先查詢,有相同Extent的Item置位對(duì)應(yīng)bit撬腾,為什么step3還可能合并同一Extent的Item螟蝙?存在同一個(gè)Extent的Item不能合并的情況?可能跟Item結(jié)構(gòu)有關(guān)民傻。胰默。
Item Tail
Item
Item
...
Item Head
Disks
CowTree(Snapshot)
node
-
leaf node
相鄰的node,如果屬于同一個(gè)Extent漓踢,且Grain ID也相鄰牵署,則合并為一個(gè)leaf node以節(jié)省空間。
在對(duì)Thin LUN做連續(xù)寫時(shí)喧半,從分配隊(duì)列分配的grain很可能滿足合并條件(在資源充足奴迅,從SPA分配到整個(gè)Extent時(shí),連續(xù)寫分配的Grain必然可以合并挺据;未從SPA分配到Extent時(shí)取具,去Free Tree取出Item分配,這里由于釋放grain時(shí)的隨機(jī)性扁耐,能合并的可能較邢炯臁)。
由于存在合并的情況婉称,使用grain id來(lái)map tree查詢時(shí)块仆,可能響應(yīng)的grain已經(jīng)和前面的node合并构蹬,所以查詢策略略有不同,未查詢到時(shí)悔据,還需要查詢前面的node中value的范圍是否包含了查詢的grain庄敛。
- key:LBA/grain size
- value:Extent Id + offset
- leaf node
- leaf node...