Memcache記憶體機制與LRU

2021-08-16 17:13:52 字數 921 閱讀 7969

memcache的記憶體分配機制:

memcache程序會預先分配一部分記憶體給slab,給slab分配的記憶體也叫page(page的預設大小是1m),每個page下面會有若干個chunk(chunk預設大小96b),而資料就會封裝成item儲存在chunk裡面,若干個大小相同的chunk稱為slab class,相同大小的chunk未必在乙個slab中。所以在預設情況下乙個slab存放的chunk數量為10922個chunk:

10922×96+ 64 = 1048576(1m) 。

但是在乙個slab中所有的chunk的大小是不同的,不同大小的chunk存放不同大小的資料。

memcache的資料刪除機制:

當資料過期時,memcache並不會直接從記憶體中刪除資料,因為memcache並不會**已經分配的記憶體,而只是在get資料時檢查時間戳是否過期,如果過期那麼客戶端就不可見,但是原來分配的記憶體可以重複使用,這叫做惰性失效。所以memcache不會對過期的資料進行監視,因此也就節省了cpu的資源。

但是在memcache中使用lru機制進行刪除資料,即最近最少使用。通過計數器來記錄哪些資料最少被使用來刪除它,所以也有可能刪除一些尚未過期或者永久有效的資料。

在每個slab中資料都是存放在鍊錶上的,鍊錶有head和tail指標,分別指向最老和最新的資料。當lru機制啟動時,兩個指標同時發揮作用查詢失效資料,如果沒有失效資料那麼就會刪除最近的最少被使用的資料。

lru只針對每個slab,並不針對整體。只有在slab不能分配新的page記憶體時才會呼叫lru。

一種有效緩解使用lru的方法是:

1,避免大物件

如果系統上只有及個別幾個大物件的話,會浪費記憶體空間,因為slab申請了page是不能釋放記憶體的,及個別大物件會導致slab申請了記憶體資源而得不到充分的利用。

2,調整增長因子

根據專案的需求調整增長因子,使記憶體充分利用。

memcache 記憶體機制與快取原理

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

memcache 記憶體機制與快取原理

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

Memcache記憶體分配機制

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