memcache內存分配策略

一、memcache介紹

memcache是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據

庫的次數,從而提高了網站訪問的速度memcache是一個基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫

MemCached是MemCache服務器端可以執行文件的名稱。這篇文章就不講memcache的安裝,感興趣的可以去看看其他文章。

二、memcache內存分配策略

當往memcache中存儲對象時,memcache並不是簡單的按對象大小來分配內存,因爲這種情況下會導致內存碎片,加重操作系統內存管理器的負擔。memcache採用的是slab allocation的內存分配策略。如圖所示:

1、MemCache將內存空間分爲一組slab
2、每個slab下又有若干個page,每個page默認是1M,如果一個slab佔用100M內存的話,那麼這個slab下應該有100個page
3、每個page裏面包含一組chunk,chunk是真正存放數據的地方,同一個slab裏面的chunk的大小是固定的
4、有相同大小chunk的slab被組織在一起,稱爲slab_class

 Slaballocation的基本原理是按照預先規定的大小,將分配的內存以page爲單位進行分割,默認情況下一個page是1M,可以通過-I參數在啓動時指定,分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合),如果需要申請內存時,memcached會劃分出一個新的page並分配給需要的slab區域。page一旦被分配在重啓前不會被回收或者重新分配,以解決內存碎片問題。

slab的內存分配具體過程如下:

       Memcached在啓動時通過-m參數指定最大使用內存,但是這個不會一啓動就佔用完,而是逐步分配給各slab的。如果一個新的數據要被存放,首先選擇一個合適的slab,然後查看該slab是否還有空閒的chunk,如果有則直接存放進去;如果沒有則要進行申請,slab申請內存時以page爲單位,無論大小爲多少,都會有1M大小的page被分配給該slab(該page不會被回收或者重新分配,永遠都屬於該slab)。申請到page後,slab會將這個page的內存按chunk的大小進行切分,這樣就變成了一個chunk的數組,再從這個chunk數組中選擇一個用於存儲數據。若沒有空閒的page的時候,則會對改slab進行LRU,而不是對整個memcache進行LRU。

接下來我們通過一組memcache命令來查看memcache的內存分配策略,首先通過telnet命令連接上mencached服務器,通過stats slabs命令我們可以看到memcache的slab信息,如下圖所示:

圖裏我們可以看到,一共有7個在使用中的slab,各個字段的含義如下

chunk_size:slab中每個chunk的大小,這也是該slab能存儲的最大item size上限。

chunks_per_page:每個page中chunk數量 chuans_per_size = page大小/chunk_size

total_pages:該slab中的page數量

total_chunks:該slab中的chunk總數

used_chunks:已經使用過的chunk數量

free_chunks:未使用的chunk數量

total_malloced:實際已經分配的總內存數,這個數值決定memcache還能申請多少內存。

通過stats命令可以查看memcache能申請的總內存大小,如下圖所示

limit_maxbytes表示memcache能申請的最大內存數,單位爲byte,這裏爲64m.

關於memcache的總結

·· 1、MemCache中可以保存的item數據量是沒有限制的,只要內存足夠
2、MemCache單進程在32位機中最大使用內存爲2G,這個之前的文章提了多次了,64位機則沒有限制
3、Key最大爲250個字節,超過該長度無法存儲
4、單個item最大數據是1MB,超過1MB的數據不予存儲
5、MemCache服務端是不安全的,比如已知某個MemCache節點,可以直接telnet過去,並通過flush_all讓已經存在的鍵值對立即失效
6、不能夠遍歷MemCache中所有的item,因爲這個操作的速度相對緩慢且會阻塞其他的操作


參考:https://docs.oracle.com/cd/E17952_01/mysql-5.1-en/ha-memcached-using-memory.html#ha-memcached-fig-slabs

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章