memcached 的記憶體分配以page為單位,預設情況下乙個page是1m,可以通過-i引數在啟動時指定。如果需要申請記憶體時,memcached會劃分出乙個新的 page並分配給需要的slab區域。page一旦被分配在重啟前不會被**或者重新分配
memcached並不是將所有大小的資料都放在一起的,而是預先將資料空間劃分為一系列slabs,每個slab只負責一定範圍內的資料儲存。如下圖,每個slab只儲存 大於其上乙個slab的size並小於或者等於自己最大size的資料。例如:slab 3只儲存大小介於137 到 224 bytes的資料。如果乙個資料大小為230byte將被分配到slab 4中。從下圖可以看出,每個slab負責的空間其實是不等的,memcached預設情況下下乙個slab的最大值為前乙個的1.25倍,這個可以通過修 改-f引數來修改增長比例。
chunk 是一系列固定的記憶體空間,這個大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached實際存放快取資料的地方,因為chunk的大小固定為slab能夠存放的最大值, 所以所有分配給當前slab的資料都可以被chunk存下。如果時間的資料大小小於chunk的大小,空餘的空間將會被閒置,這個是為了防止記憶體碎片而設計的。例如下圖,chunk size是224byte,而儲存的資料只有200byte,剩下的24byte將被閒置。
memcached在啟動時通過-m指定最大使用記憶體,但是這個不會一啟動就占用,是隨著需要逐步分配給各slab的。如果乙個新的快取資料要被存放,memcached首先選擇乙個合適的slab,然後檢視該slab是否還有空閒的chunk,如果有則直接存放進去;如果沒有則要進行申請。slab申請記憶體時以page為單位,所以在放入第乙個資料,無論大小為多少,都會有1m大小的page被分配給該slab。申請到 page後,slab會將這個page的記憶體按chunk的大小進行切分,這樣就變成了乙個chunk的陣列,在從chunk陣列中選擇乙個用於儲存 資料。如下圖,slab 1和slab 2都分配了乙個page,並按各自的大小切分成chunk陣列。
綜合上面的介紹,memcached的記憶體分配策略就是:按slab需求分配page,各slab按需使用chunk儲存。本文**:這裡有幾個特點要注意:
Memcache記憶體分配機制
1.page 頁 為記憶體分配的最小單位 memcached 的記憶體分配以page為單位,預設情況下乙個page是1m,可以通過 i引數在啟動時指定。如果需要申請記憶體時,memcached會劃分出乙個新的page並分配給需要的slab區域。page一旦被分配在重啟前不會被 或者重新分配 2.sl...
memcache記憶體分配機制
memcached的記憶體分配沒有用到c語言中自帶的malloc函式,因為這個函式分配記憶體的時候效率很低,對於這種要求快速響應,對效率要求非常高的快取軟體來說非常不合適。memcached用的是自己的一套記憶體分配方法,叫做slab allocation。64位的作業系統能分配 2gb 以上的記憶...
C C 記憶體分配機制
1.c語言中的記憶體機制 在c語言中,記憶體主要分為如下5個儲存區 1 棧 stack 位於函式內的區域性變數 包括函式實參 由編譯器負責分配釋放,函式結束,棧變數失效。2 堆 heap 由程式設計師用malloc calloc realloc分配,free釋放。如果程式設計師忘記free了,則會造...