Memcached 以內存管理與刪除機制

1、內存的碎片化緩存

  若是用c語言直接 malloc,free 來向操做系統申請和釋放內存時,在不斷的申請和釋放過程當中,造成了一些很小的內存片段,沒法再利用,這種空閒,但沒法利用內存的現象稱爲內存的碎片化。memcached

2、slab allocator (對象緩存分配)緩解內存碎片化網站

  memcached 用 slab allocator 機制來管理內存。slab allocator 原理: 把內存劃分紅數個 slab class 倉庫.(每一個 slab class 大小 1M,注:Slab是一個內存塊)各倉庫,切分紅不一樣尺寸的小塊(chunk)。須要存內容時,判斷內容的大小,爲其選取合理的倉庫。chunk就是用來存儲key-value數據的最小單位。操作系統

  如圖:對象

    

3、系統如何選擇合適的 chunk?blog

  memcached 根據收到的數據的大小,選擇最適合數據大小的 chunk 組(slab class)。memcached 中保存着 slab class 內空閒 chunk 的列表,根據該列表選擇空的 chunk,而後將數據緩存於其中。內存

  如圖:開發

    

  注意:若是有 100byte 的內容要存,但 122 大小的倉庫中的 chunk 滿了並不會尋找更大的,如 144 的倉庫來存儲,而是把 122 倉庫的舊數據踢掉。get

4、固定大小 chunk 帶來的內存浪費it

  因爲 slab allocator 機制中,分配的 chunk 的大小是」固定」的, 所以,對於特定的 item,可能形成內存空間的浪費. 好比,將 100 字節的數據緩存到 122 字節的 chunk 中,剩餘的 22 字節就浪費了。

  如圖:

    

  對於chunk 空間的浪費問題,沒法完全解決,只能緩解該問題。開發者能夠對網站中緩存中的 item 的長度進行統計,並制定合理的 slab class 中的 chunk 的大小。惋惜的是,咱們目前還不能自定義 chunk 的大小,但能夠經過參數來調整各 slab class 中 chunk大小的增加速度。即增加因子, grow factor。

5、grow factor (增加因子)調優

  memcached 在啓動時能夠經過­f 選項指定 Growth Factor 因子,並在某種程度上控制 slab 之間的差別。默認值爲 1.25. 可是,在該選項出現以前,這個因子曾經固定爲 2,稱爲」powers of 2」 策略。

6、memcached 的過時數據惰性刪除

  1. 當某個值過時後,並無從內存刪除,所以,stats 統計時, curr_item 有其信息。

  2. 當某個新值去佔用他的位置時,當成空 chunk 來佔用。

  3. 當 get 值時,判斷是否過時,若是過時,返回空,而且清空,curr_item 就減小了。

  數據沒有在過時的瞬間當即從內存刪除,這個稱爲 lazy expiration,惰性失效。節省了cpu時間和檢測的成本。

7、lru(最近最少使用) 刪除機制

  若是以 122byte 大小的 chunk 舉例, 122 的 chunk 都滿了, 又有新的值(長度爲 120)要加入, 要擠掉誰? memcached 此處用的 lru 刪除機制。

相關文章
相關標籤/搜索