Memcache 記憶體分配策略
阿新 • • 發佈:2018-12-12
memcached預設採用了名為Slab Allocator
的機制分配和管理記憶體。
在該機制出現以前,記憶體的分配是通過對所有記錄簡單的進行malloc
和free
來進行了。但是這種方式會導致記憶體碎片化嚴重,加重作業系統記憶體管理器的負擔。Slab Allocator
就是位瞭解決該問題而誕生的。
Slab Allocator
的基本原理是:按照預先規定的大小,將分配的記憶體以page為單位,預設情況下一個page是1M(可以通過-I引數
在啟動memcached的時候指定),分割成各種尺寸的塊(chunk),並把尺寸相同的塊(chunk)分成組(chunk集合)。如果需要申請記憶體時,memcached會劃分出一個新的page並分配給需要的slab區域。
page一旦被分配,在memcached重啟前不會被回收或者重新分配,以解決記憶體碎片問題。
slab的記憶體分配具體過程如下:
memcached在啟動的時候通過-m引數
指定最大記憶體,但是這個不會一啟動就佔用完,而是逐步分配給各個slab
的。如果一個新的資料要被存放,首選選擇一個合適的slab,然後檢視該slab是否還有空閒的chunk,如果有則直接存放進去;如果沒有則要進行申請,slab申請記憶體是以page為單位的,無論大小為多少,都會有1M大小的page被分配給該slab。
申請到page後,slab會將這個page的記憶體按chunk的大小進行切分,這樣就變成了一個chunk的組,再從這個chunk組中選擇一個用於儲存資料。