面試之 Memcache 相關

Shine-x發表於2019-03-12

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.調整增長因子

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

  • memcached 支援 Binary Protocol,而 memcache 不支援,意味著 memcached 會有更高的效能。
  • 不過,還需要注意的是,memcached 目前還不支援長連線。
  • memcached 比 memcache 支援更多的 memcache 協議,大概也就是說 memcached 有更多的方法,比如 getMulti() 和 setMulti() 函式非常有用,但是 memcache 並不支援。

存到硬碟,作業系統都有虛擬記憶體,當記憶體滿了,都會存到虛擬記憶體裡而虛擬記憶體是存放在硬碟上,所以MEMCACHE滿了會存到硬碟要麼就增加記憶體空間,要麼將一些臨時用的資料操作完之後,立即銷燬,避免佔記憶體。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章