天天看點

Memcache記憶體配置設定

Memcached的記憶體配置設定以page為機關,預設情況下一個page是1M,可以通過-I參數在啟動時指定。如果需要申請記憶體時,memcached會劃分出一個新的page并配置設定給需要的slab區域。page一旦被配置設定在重新開機前不會被回收或者重新配置設定(page ressign已經從1.2.8版移除了) 

Memcache記憶體配置設定

Slabs劃分資料空間 

Memcached并不是将所有大小的資料都放在一起的,而是預先将資料空間劃分為一系列slabs,每個slab隻負責一定範圍内的資料存儲。如下圖,每個slab隻存儲大于其上一個slab的size并小于或者等于自己最大size的資料。例如:slab 3隻存儲大小介于137 到 224 bytes的資料。如果一個資料大小為230byte将被配置設定到slab 4中。從下圖可以看出,每個slab負責的空間其實是不等的,memcached預設情況下下一個slab的最大值為前一個的1.25倍,這個可以通過修改-f參數來修改增長比例。 

Memcache記憶體配置設定

Chunk才是存放緩存資料的機關 

Chunk是一系列固定的記憶體空間,這個大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached實際存放緩存資料的地方,因為chunk的大小固定為slab能夠存放的最大值,是以所有配置設定給目前slab的資料都可以被chunk存下。如果時間的資料大小小于chunk的大小,空餘的空間将會被閑置,這個是為了防止記憶體碎片而設計的。例如下圖,chunk size是224byte,而存儲的資料隻有200byte,剩下的24byte将被閑置。 

Memcache記憶體配置設定

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數組。 

Memcache記憶體配置設定

Memcached記憶體配置設定政策 

綜合上面的介紹,memcached的記憶體配置設定政策就是:按slab需求配置設定page,各slab按需使用chunk存儲。

這裡有幾個特點要注意,Memcached配置設定出去的page不會被回收或者重新配置設定Memcached申請的記憶體不會被釋放slab空閑的chunk不會借給任何其他slab使用 

Memcache記憶體配置設定

Memcached記憶體釋放

Lazy Expiration

memcached内部不會監視記錄是否過期,而是在get時檢視記錄的時間戳,檢查記錄是否過期。這種技術被稱為lazy(惰性)expiration。是以,memcached不會在過期監視上耗費CPU時間。

LRU:從緩存中有效删除資料的原理

memcached會優先使用已逾時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名為 Least Recently Used(LRU)機制來配置設定空間。顧名思義,這是删除“最近最少使用”的記錄的機制。是以,當memcached的記憶體空間不足時(無法從slab class 擷取到新的空間時),就從最近未被使用的記錄中搜尋,并将其空間配置設定給新的記錄。從緩存的實用角度來看,該模型十分理想。

繼續閱讀