Memcached是一個高效的分佈式內存cache,瞭解memcached的內存管理機制,便於咱們理解memcached,讓咱們能夠針對咱們數據特色進行調優,讓其更好的爲我所用。這裏簡單談一下我對memcached的內存管理的一些認識,在沒有特別註明的狀況下,這裏談到的memcached是1.2版本,1.1和1.2版本有一些差別。分佈式
基本概念:Slab和chunkmemcached
在Memcached內存結構中有兩個很是重要的概念:slab 和 chunk,咱們先從下圖中對這兩個概念有一個感性的認識:spa
圖 1 memcached內存結構ip
Slab是一個內存塊,它是memcached一次申請內存的最小單位。在啓動memcached的時候通常會使用參數-m指定其可用內存,可是並非在啓動的那一刻全部的內存就所有分配出去了,只有在須要的時候纔會去申請,並且每次申請必定是一個slab。Slab的大小固定爲1M(1048576 Byte),一個slab由若干個大小相等的chunk組成。每一個chunk中都保存了一個item結構體、一對key和value。內存
雖然在同一個slab中chunk的大小相等的,可是在不一樣的slab中chunk的大小並不必定相等,在memcached中按照chunk的大小不一樣,能夠把slab分爲不少種類(class)。在啓動memcached的時候能夠經過-vv來查看slab的種類:ci
圖2 slab分組信息it
從上圖能夠看到,默認狀況下memcached把slab分爲40類(class1~class40),在class 1中,chunk的大小爲80字節,因爲一個slab的大小是固定的1048576字節(1M),所以在class1中最多能夠有13107個chunk:內存管理
13107×80 + 16 = 1048576table
在class1中,剩餘的16字節由於不夠一個chunk的大小(80byte),所以會被浪費掉。每類chunk的大小有必定的計算公式的,假定i表明分類,class i的計算公式以下:class
chunk size(class i) : (default_size+item_size)*f^(i-1)+ CHUNK_ALIGN_BYTES
default_size: 默認大小爲48字節,也就是memcached默認的key+value的大小爲48字節,能夠經過-n參數來調節其大小;
item_size: item結構體的長度,固定爲32字節。default_size大小爲48字節,item_size爲32,所以class1的chunk大小爲48+32=80字節;
f爲factor,是chunk變化大小的因素,默認值爲1.25,調節f能夠影響chunk的步進大小,在啓動時可使用-f來指定;
CHUNK_ALIGN_BYTES是一個修正值,用來保證chunk的大小是某個值的整數倍(在32位機器上要求chunk的大小是4的整數倍)。
從上面的分析能夠看到,咱們實際能夠調節的參數有-f、-n,在memcached的實際運行中,咱們還須要觀察咱們的數據特徵,合理的調節f,n的值,使咱們的內存獲得充分的利用減小浪費。
內存申請分配
Memcached內存管理採起預分配、分組管理的方式,分組管理就是咱們上面提到的slab class,按照chunk的大小slab被分爲不少種類。下面解釋一下memcached的內存預分配過程。
向memcached添加一個item時候,memcached首先會根據item的大小,來選擇最合適的slab class:例如item的大小爲190字節,默認狀況下class 4的chunk大小爲160字節顯然不合適,class 5的chunk大小爲200字節,大於190字節,所以該item將放在class 5中(顯然這裏會有10字節的浪費是不可避免的),計算好所要放入的chunk以後,memcached會去檢查該類大小的chunk還有沒有空閒的,若是沒有,將會申請1M(1個slab)的空間並劃分爲該種類chunk。例如咱們第一次向memcached中放入一個190字節的item時,memcached會產生一個slab class 2(也叫一個page),並會用去一個chunk,剩餘5241個chunk供下次有適合大小item時使用,當咱們用完這全部的5242個chunk以後,下次再有一個在160~200字節之間的item添加進來時,memcached會再次產生一個class 5的slab(這樣就存在了2個pages)。查看slab的使用狀況,咱們能夠telnet ip port,而後輸入命令 stats slabs便可:
例如:telnet 10.0.4.210 11211
stats slabs STAT 5:chunk_size 200 STAT 5:chunks_per_page 5242 STAT 5:total_pages 1 STAT 5:total_chunks 5242 STAT 5:used_chunks 5242 STAT 5:free_chunks 0 STAT 5:free_chunks_end 5241 STAT active_slabs 1 STAT total_malloced 1048400 |
圖3 stats slab
圖3顯示的是第一次放入一個190字節的item以後的統計結果。