Memcached 的記憶體分配以page為單位,預設為下一個page是1M,可以透過-I參數啟動時指定。如果需要申請記憶體時,memcached會分割出一個新的 page並分配給所需的slab區域。 page一旦被分配在重啟前不會被回收或重新分配
Memcached並不是將所有大小的資料放在一起的,Memcached並不是將所有大小的資料放在一起的,而是預先將資料空間劃分為一系列slabs,每個slab只負責一定範圍內的資料儲存
。如下圖,每個slab只儲存 大於其上一個slab的size並小於或等於自己最大size的資料。例如:slab 3只儲存大小介於137 到 224 bytes的資料。如果一個資料大小為230byte將被分配到slab 4。從下圖可以看出,每個slab負責的空間其實是不等的,memcached預設情況下下一個slab的最大值為前一個的1.25倍,這個可以透過修
改-f參數來修改成長比例。
Chunk(區塊)才是存放快取資料的單位。 Chunk
是一系列固定的記憶體空間,這個大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。 chunk是memcached實際存放快取資料的地方,因為chunk的大小固定為slab能夠存放的最大值, 所以所有分配給目前slab的資料都可以被chunk存下。如果時間的資料大小小於chunk的大小,空閒的空間將會閒置,這個是為了防止記憶體碎片而設計的
Slab的記憶體分配。
Memcached在啟動時通過-m指定最大使用內存,但是這個不會一啟動就佔用,是隨著需要逐步分配給各slab的。
如果一個新的快取資料要被存放,memcached先選擇一個合適的slab,然後查看該slab是否還有空閒的chunk,如果有則直接存放進去;如果沒有則要進行申請。 slab申請記憶體時以page為單位,所以在放入第一個數據,無論大小為多少,都會有1M大小的page被分配給該slab
Memcached記憶體分配策略。
綜合上面的介紹,memcached的記憶體分配策略就是:按slab需求分配page,各slab按需使用chunk儲存。
以上就介紹了Memcache記憶體分配機制,包含了方面的內容,希望對PHP教程有興趣的朋友有所幫助。 🎜 🎜 🎜