1、Memcache內存分配機制 數組
關於這個機制網上有不少解釋的,我我的的總結以下。 緩存
Page爲內存分配的最小單位。 memcached
Memcached的內存分配以page爲單位,默認狀況下一個page是1M,能夠經過-I參數在啓動時指定。若是須要申請內存 時,memcached會劃分出一個新的page並分配給須要的slab區域。page一旦被分配在重啓前不會被回收或者從新分配(page ressign已經從1.2.8版移除了)
spa
Slabs劃分數據空間。 內存
Memcached並非將全部大小的數據都放在一塊兒的,而是預先將數據空間劃分爲一系列slabs,每一個slab只負責必定範圍內的數據存儲。如 下圖,每一個slab只存儲大於其上一個slab的size並小於或者等於本身最大size的數據。例如:slab 3只存儲大小介於137 到 224 bytes的數據。若是一個數據大小爲230byte將被分配到slab 4中。從下圖能夠看出,每一個slab負責的空間實際上是不等的,memcached默認狀況下下一個slab的最大值爲前一個的1.25倍,這個能夠經過修 改-f參數來修改增加比例。
im
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在啓動時經過-m指定最大使用內存,可是這個不會一啓動就佔用,是隨着須要逐步分配給各slab的。
若是一個新的緩存數據要被存放,memcached首先選擇一個合適的slab,而後查看該slab是否還有空閒的chunk,若是有則直接存放進去;如 果沒有則要進行申請。slab申請內存時以page爲單位,因此在放入第一個數據,不管大小爲多少,都會有1M大小的page被分配給該slab。申請到 page後,slab會將這個page的內存按chunk的大小進行切分,這樣就變成了一個chunk的數組,在從這個chunk數組中選擇一個用於存儲 數據。以下圖,slab 1和slab 2都分配了一個page,並按各自的大小切分紅chunk數組。
img
Memcached內存分配策略。
綜合上面的介紹,memcached的內存分配策略就是:按slab需求分配page,各slab按需使用chunk存儲。
這裏有幾個特色要注意,
Memcached分配出去的page不會被回收或者從新分配Memcached申請的內存不會被釋放slab空閒的chunk不會借給任何其餘slab使用
知道了這些之後,就能夠理解爲何總內存沒有被所有佔用的狀況下,memcached卻出現了丟失緩存數據的問題了。