memcache記憶體估算整理

2021-08-09 03:14:53 字數 4533 閱讀 6838

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...