memcached是乙個高效的分布式記憶體cache,了解memcached的記憶體管理機制,便於我們理解memcached,讓我們可以針對我們資料特點進行調優,讓其更好的為我所用。這裡簡單談一下我對 memcached的記憶體管理的一些認識,在沒有特別註明的情況下,這裡談到的memcached是1.2版本,1.1和1.2版本有一些差異。
基本概念:slab和chunk
在memcached記憶體結構中有兩個非常重要的概念:slab 和 chunk,我們先從下圖中對這兩個概念有乙個感性的認識:
圖 1 memcached記憶體結構
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的種類:
圖2 slab分組資訊
從上圖可以看到,預設情況下memcached把slab分為40類(class1~class40),在class 1中,chunk的大小為80位元組,由於乙個slab的大小是固定的1048576位元組(1m),因此在class1中最多可以有13107個chunk:
13107×80 + 16 = 1048576
在class1中,剩餘的16位元組因為不夠乙個chunk的大小(80byte),因此會被浪費掉。每類chunk的大小有一定的計算公式的,假定i代表分類,class i的計算公式如下:
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之後的統計結果。
memcached記憶體管理
原文 基本概念 slab,page,chunk。slab,是乙個邏輯概念。它是在啟動memcached例項的時候預處理好的,每個slab對應乙個chunk size,也就是說不同slab有不同的chunk size。具體分配多少個slab由引數 f 增長因子 和 n chunk最小尺寸 決定的。pa...
Memcached工作原理以及記憶體管理
memcached工作原理 包括服務端和客戶端,以鍵值對的形式儲存。key根據乙個 hash 演算法得到乙個 hashkey 根據這個值來確定選擇哪台伺服器儲存。客戶端根據 key的值用相同的方法計算出 hash 值,確定是哪個伺服器,然後進行連線,獲取 value值 快取策略 當服務端的hash ...
Memcached記憶體管理模型與LRU演算法優化
memcached 採用的是 slab allocation 記憶體模型,如下圖 說明 1 最大記憶體預設64兆,通過 m調整,記憶體空間有slab class構成,記憶體以slab page為單位申請,分配到對應的slab class 2 slab page 最大1兆,由乙個或多個chunk組成 ...