memcache 記憶體機制與快取原理

2021-09-22 02:41:21 字數 2154 閱讀 8649

如果用 c 語言直接 malloc,free 來向作業系統申請和釋放記憶體時,在不斷的申請和釋放過程中,形成了一些很小的記憶體片斷,無法再利用.這種空閒,但無法利用記憶體的現象,—稱為記憶體的碎片化.

memcached 用 slab allocator 機制來管理記憶體.

slab allocator 原理: 預告把記憶體劃分成數個 slab class 倉庫.(每個 slab class 大小 1m)各倉庫,切分成不同尺寸的小塊(chunk). (圖 3.2)

需要存內容時,判斷內容的大小,為其選取合理的倉庫.

memcached 根據收到的資料的大小, 選擇最適合資料大小的 chunk 組(slab class)memcached 中儲存著 slab class 內空閒 chunk 的列表, 根據該列表選擇空的 chunk, 然後將資料快取於其中。

警示:如果有 100byte 的內容要存,但 122 大小的倉庫中的 chunk 滿了

並不會尋找更大的,如 144 的倉庫來儲存,

而是把 122 倉庫的舊資料踢掉! 詳見過期與刪除機制

由於 slab allocator 機制中, 分配的 chunk 的大小是」固定」的, 因此, 對於特定的 item,可能造成記憶體空間的浪費.

比如, 將 100 位元組的資料快取到 122 位元組的 chunk 中, 剩餘的 22 位元組就浪費了

對於 chunk 空間的浪費問題,無法徹底解決,只能緩解該問題.開發者可以對**中快取中的 item 的長度進行統計,並制定合理的 slab class 中的 chunk 的大小.

可惜的是,我們目前還不能自定義 chunk 的大小,但可以通過引數來調整各 slab class 中 chunk大小的增長速度. 即增長因子, grow factor!

memcached 在啟動時可以通過­f 選項指定 growth factor 因子, 並在某種程度上控制 slab 之間的差異. 預設值為 1.25. 但是,在該選項出現之前,這個因子曾經固定為 2,稱為」powers of 2」 策略。我們:

#分別用 grow factor 為 2 和 1.25 來看一看效果

memcached -f 2 -vvv

...memcached -f 2.5 -vvv

...#對比可知, 當 f=2 時, 各 slab 中的 chunk size 增長很快,有些情況下就相當浪費記憶體.因此,我們應細心統計快取的大小,制定合理的增長因子.

(注意:當 f=1.25 時,從輸出結果來看,某些相鄰的 slab class 的大小比值並非為 1.25,可能會覺得有些計算誤差,這些誤差是為了保持位元組數的對齊而故意設定的.)

當某個值過期後,並沒有從記憶體刪除, 因此,stats 統計時, curr_item 有其資訊

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

當 get 值時,判斷是否過期,如果過期,返回空,並且清空, curr_item 就減少了.

如果以 122byte 大小的 chunk 舉例, 122 的 chunk 都滿了, 又有新的值(長度為 120)要加入, 要 擠掉誰?memcached 此處用的 lru 刪除機制.(作業系統的記憶體管理,常用 fifo,lru 刪除)

lru: least recently used 最近最少使用 fifo: first in ,first out 原理: 當某個單元被請求時,維護乙個計數器,通過計數器來判斷最近誰最少被使用. 就把誰t出.

(注:即使某個 key 是設定的永久有效期,也一樣會被踢出來!

即–永久資料被踢現象)

key 的長度: 250 位元組, (二進位制協議支援 65536 個位元組)

value 的限制: 1m, 一般都是儲存一些文字,如新聞列表等等,這個值足夠了.

記憶體的限制: 32 位下最大設定到 2g.

如果有 30g 資料要快取,一般也不會單例項裝 30g, (不要把雞蛋裝在乙個籃子裡),一般建議 開啟多個例項(可以在不同的機器,或同台機器上的不同埠)

memcache 記憶體機制與快取原理

如果用 c 語言直接 malloc,free 來向作業系統申請和釋放記憶體時,在不斷的申請和釋放過程中,形成了一些很小的記憶體片斷,無法再利用.這種空閒,但無法利用記憶體的現象,稱為記憶體的碎片化.memcached 用 slab allocator 機制來管理記憶體.slab allocator ...

Memcache記憶體機制與LRU

memcache的記憶體分配機制 memcache程序會預先分配一部分記憶體給slab,給slab分配的記憶體也叫page page的預設大小是1m 每個page下面會有若干個chunk chunk預設大小96b 而資料就會封裝成item儲存在chunk裡面,若干個大小相同的chunk稱為slab ...

Memcache記憶體分配機制

1.page 頁 為記憶體分配的最小單位 memcached 的記憶體分配以page為單位,預設情況下乙個page是1m,可以通過 i引數在啟動時指定。如果需要申請記憶體時,memcached會劃分出乙個新的page並分配給需要的slab區域。page一旦被分配在重啟前不會被 或者重新分配 2.sl...