memcache 記憶體管理

2021-07-11 16:49:59 字數 1345 閱讀 7070

page為記憶體分配的最小單位

memcached 的記憶體分配以page為單位,預設情況下乙個page是1m

slabs劃分資料空間

memcached 並不是將所有大小的資料都放在一起的,而是預先將資料空間劃分為一系列slabs,每個slab只負責一定範圍內的資料儲存。

每個slab負責的空間其實是不等的,memcached預設情況下下乙個slab的最大值為前乙個的1.25倍。

例如:slab 3只儲存大小介於137 到 224 bytes的資料。如果乙個資料大小為230byte將被分配到slab 4中

chunk才是存放快取資料的單位

chunk 是一系列固定的記憶體空間,這個大小就是管理它的slab的最大存放大小。

例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached實際存放快取資料的地方,因為chunk的大小固定為slab能夠存放的最大值, 所以所有分配給當前slab的資料都可以被chunk存下。如果時間的資料大小小於chunk的大小,空餘的空間將會被閒置,這個是為了防止記憶體碎片而設 計的。例如下圖,chunk size是224byte,而儲存的資料只有200byte,剩下的24byte將被閒置。

slab的記憶體分配

如果乙個新的快取資料要被存放,memcached首先選擇乙個合適的slab,然後檢視該slab是否還有空閒的chunk,如果有則直接存放進去;如果沒有則要進行申請。

slab申請記憶體時以page為單位,所以在放入第乙個資料,無論大小為多少,都會有1m大小的page被分配給該slab。

申請到 page後,slab會將這個page的記憶體按chunk的大小進行切分,這樣就變成了乙個chunk的陣列,在從這個chunk陣列中選擇乙個用於儲存 資料。如下圖,slab 1和slab 2都分配了乙個page,並按各自的大小切分成chunk陣列。

memcached記憶體分配策略

memcached分配出去的page不會被**或者重新分配

memcached申請的記憶體不會被釋放

slab空閒的chunk不會借給任何其他slab使用

Memcache記憶體管理

在不斷malloc和free操作,會形成很小的記憶體的片段,我們無法繼續利用。slab allocator機制 將記憶體劃分為數個slab class倉庫 各個倉庫切分成不同尺寸的小塊 chunk 需要存放內容的時候,需要先判斷內容的大小,為期選擇合理的倉庫存放 memcache儲存著slab cl...

memcache的記憶體管理機制

memcache使用了slab allocator的記憶體分配機制 按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以 完全解決記憶體碎片問題 memcache的儲存涉及到slab,page,chunk三個概念 1 chunk為固定大小的記憶體空間,預設為96byte。2 page對應實際的物...

memcache中記憶體管理原始碼剖析

memcahce採用了記憶體頁面,記憶體頁面上的記憶體塊技術實現了記憶體管理器,對item的指標採用了hashtable的方法,通過item的key值實現快速定位查詢item指標的方法,這裡詳細剖析一下實現的關鍵 首先是記憶體管理,在slabs.c 中實現.1 void slabs init voi...