memcache記憶體分配三個重要的概念:
1.page
系統分配給slab的記憶體空間(對應實際的物理空間),1個page預設為1m,可以使用-i引數進行調解(default: 1mb, min: 1k, max: 128m),分配給slab之後根據chunk的大小切分成大小相同的chunk空間,chunk用於快取記錄。
2.chunk
為固定大小的記憶體空間,預設為96byte,可以使用-n引數進行調節,預設的-f大小為1.25,即每個slab的chunk大小會以1.25倍的大小增長
3. slab class
同樣大小的chunk又稱為slab class。
三個重要的引數 -m -f -n
-m 分配的最大記憶體
-f slab class(chunk組)的增長因子
-n ( slab class 1中)chunk的初始大小
memcached -f 2 -vv命令看以看到,當增長因子為2(預設為1.25)的時候可以分配的slab class
test:~$ memcached -f 2 -vv
slab class 1: chunk
size 96 perslab 10922
slab class 2: chunk
size 192 perslab 5461
slab class 3: chunk
size 384 perslab 2730
slab class 4: chunk
size 768 perslab 1365
slab class 5: chunk
size 1536 perslab 682
slab class 6: chunk
size 3072 perslab 341
slab class 7: chunk
size 6144 perslab 170
slab class 8: chunk
size 12288 perslab 85
slab class 9: chunk
size 24576 perslab 42
slab class 10: chunk
size 49152 perslab 21
slab class 11: chunk
size 98304 perslab 10
slab class 12: chunk
size 196608 perslab 5
slab class 13: chunk
size 393216 perslab 2
slab class 14: chunk
size 1048576 perslab 1
chunk size(slab class i)=(default_size+item_size)*f^(i-1)+ chunk_align_bytes
default_size: 預設大小為48位元組,也就是memcached預設的key+value的大小為48位元組;
item_size: item結構體的長度,預設為48位元組,可以通過-n引數調節;
chunk_align_bytes是乙個修正值,用來保證chunk的大小是某個值的整數倍。
假設要儲存100bytes的item
1、首先會找到包含其大小的chunk組,即slab class 2
2、如果slab class 2已經存在同時也還有chunk空閒,即將item儲存在此
3、如果沒有分配slab class 2的page或分配的chunk已滿,則由系統重新分配乙個page,設定其為slab class 2大小,並將item儲存在此。
當使用stats slabs命令檢視時,可以看到memcache所分配的slab class
memcached -p 50013 -l 0.0.0.0 -d -m 32 -f 1.001 -n 256
如果-f的值是1.001即每個slab的大小都一樣時,使用命令就只有stat 1,class 1的大小為 256+48
stats slabs
stat 1:chunk_size 304
//slab class 1的chunk大小,256+48=304 byte
stat 1:chunks_per_page 3449
//每個page能儲存的chunk數,1m/304byte = 1024*1024/304 = 3449,多餘的空間會被浪費
stat 1:total_pages 3
//分配給slab class 1的page數,即3m
stat 1:total_chunks 10347
//總共分配的chunk數,3449 * 3
stat 1:used_chunks 8194
stat 1:free_chunks 1
//過期資料空出的chunk裡還沒有被使用的chunk數
stat 1:free_chunks_end 2152
//分配了但是還沒有被使用的chunk數
stat 1:mem_requested 1001154
stat 1:get_hits 5681468
stat 1:cmd_set 571263
stat 1:delete_hits 0
stat 1:incr_hits 0
stat 1:decr_hits 0
stat 1:cas_hits 0
stat 1:cas_badval 0
stat 1:touch_hits 0
stat active_slabs 1
stat total_malloced 3145488
//總共分配的記憶體大小 ,10347*34
end
如果free_chunks_end的數過大,表明這部分slab記憶體不能有效的利用;如果過小表明很快就不夠用了;兩種情況都需要做調整來使記憶體達到合理的利用。
memcached -p 50013 -l 0.0.0.0 -d -m 32 (-f 1.25 -n 48)
當有一定的增長因子時,如按預設的1.25,檢視slab時就會出現不同的slab class資訊,-f -n使用預設值
stats slabs
stat
1:chunk_size
96stat
1:chunks_per_page
10922
stat
1:total_pages
1stat
1:total_chunks
10922
stat
1:used_chunks
9stat
1:free_chunks
1stat
1:free_chunks_end
10912
stat
1:mem_requested
818stat
1:get_hits
5stat
1:cmd_set
139stat
1:delete_hits
1stat
1:incr_hits
0stat
1:decr_hits
0stat
1:cas_hits
0stat
1:cas_badval
0stat
2:chunk_size
120stat
2:chunks_per_page
8738
stat
2:total_pages
1stat
2:total_chunks
8738
stat
2:used_chunks
24stat
2:free_chunks
0stat
2:free_chunks_end
8714
stat
2:mem_requested
2794
stat
2:get_hits
1stat
2:cmd_set
60stat
2:delete_hits
0stat
2:incr_hits
0stat
2:decr_hits
0stat
2:cas_hits
0stat
2:cas_badval
0
slab class的分配並不是按照順序來分配的,所有當有不同的slab class時,使用stats slabs檢視可能會出現
stat 1
…… stat 2
…… stat 5
…….
stat 9
…….
Memcache記憶體管理
在不斷malloc和free操作,會形成很小的記憶體的片段,我們無法繼續利用。slab allocator機制 將記憶體劃分為數個slab class倉庫 各個倉庫切分成不同尺寸的小塊 chunk 需要存放內容的時候,需要先判斷內容的大小,為期選擇合理的倉庫存放 memcache儲存著slab cl...
memcache 記憶體管理
page為記憶體分配的最小單位 memcached 的記憶體分配以page為單位,預設情況下乙個page是1m slabs劃分資料空間 memcached 並不是將所有大小的資料都放在一起的,而是預先將資料空間劃分為一系列slabs,每個slab只負責一定範圍內的資料儲存。每個slab負責的空間其實...
Memcache 記憶體分配策略
memcached預設採用了名為slab allocator的機制分配和管理記憶體。在該機制出現以前,記憶體的分配是通過對所有記錄簡單的進行malloc和free來進行了。但是這種方式會導致記憶體碎片化嚴重,加重作業系統記憶體管理器的負擔。slab allocator就是位了解決該問題而誕生的。sl...