memcached預設採用slab allocation機制分配管理記憶體。在該機制之前,memcached簡單地通過malloc和free進行記憶體分配,這種分配方式會產生大量的記憶體碎片,同時加重作業系統記憶體管理的負擔。在最壞的情況下, 作業系統會比memcached程序本身還慢。slab allocation機制的出現,解決了記憶體管理上的一系列問題。
slab allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊, 以完全解決記憶體的外部碎片問題。如圖1,記憶體被分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(slab class)。
圖1 slab allocation基本原理
如圖2,memcached根據收到的資料大小,選擇最合適的slab。memcached儲存著slab內空閒chunk的列表,根據該列表選擇chunk, 然後將分配chunk將資料快取其中。
圖2 slab分配記憶體
slab allocation解決了外部碎片的問題,帶同事帶來了內部碎片。由於chunk的大小是特定的,所以無法有效利用chunk的記憶體。如圖3,將100bytes的資料快取到128bytes的chunk中,浪費了28bytes。
圖3 chunk內部碎片
chunk的內部碎片,實際上是由不同大小的chunk之間的差異造成的,如果不同大小的chunk之間差異十分微小,那麼chunk的內部碎片幾乎可以消除,因為記憶體分配時總是會選擇最合適的chunk分配。
memcached在啟動時指定growth factor因子(-f選項),就可以控制slab之間的差異。選擇乙個合適的growth factor可以有效地減少內部碎片。
事實上,如果預先指定客戶端傳送的資料的一般大小,或者僅快取大小相同的資料,只需要使用大小匹配的slab即可完全避免內部碎片。雖然這種情況很少能夠遇到。memcached雖然是分布式快取伺服器,但服務端並不具有分布式功能,服務端只具有儲存功能,memcached的分布式完全由客戶端實現。
下面通過乙個示例介紹memcached的分布式。
假設有node1~node3三颱伺服器如圖4,需要儲存「tokyo」、「kanagawa」、「chiba」、「saitama」、「gunma」五個鍵對應的資料。
圖4 分布式初始狀態
然後首先向memcached中新增「tokyo」。將「tokyo」傳給客戶端程式庫後, 客戶端實現的分布式演算法就會根據「鍵」來決定儲存資料的node。 如圖5,將「tokyo儲存到node1。
圖5 將」tokyo「儲存到node1
同樣,為「kanagawa」「chiba」「saitama」「gunma」選擇相應的node。
在獲取儲存的資料時,將要獲取的鍵「tokyo」傳遞給函式庫。 函式庫通過與資料儲存時相同的演算法,選擇對應的伺服器。使用的演算法相同,就能選中與儲存時相同的伺服器。 只要資料沒有因為某些原因被刪除,就能獲得儲存的值。如圖6。
圖6 獲取tokyo
這樣,將不同的鍵儲存到不同的伺服器上,就實現了memcached的分布式。memcached伺服器增多後,鍵就會分散,即使一台memcached伺服器發生故障無法連線,也不會影響其他的快取,系統依然能繼續執行。
客戶端上最簡單的分布式演算法之一,就是基於餘數的hash,即通過鍵的整數雜湊值除以伺服器數量,根據求得的餘數確定鍵分配的伺服器。
餘數計算的方法簡單,資料的分散性也相當優秀,但在新增或移除伺服器時,快取重組的代價相當巨大。新增伺服器後,餘數就會產生巨變,這樣就無法獲取與儲存時相同的伺服器, 從而影響快取的命中率。
一致性雜湊出現的目的,即減少增減伺服器時,快取重組的代價。其原理如圖7所示,首先求出memcached伺服器(節點)的雜湊值, 並將其配置到0~232的圓(continuum)上。 然後用同樣的方法求出儲存資料的鍵的雜湊值,並對映到圓上。 然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第乙個伺服器上。 如果超過232仍然找不到伺服器,就會儲存到第一台memcached伺服器上。
圖7 一致性雜湊原理
在圖7的基礎上,新增一台伺服器,如圖8,只有在continuum上增加伺服器的地點逆時針方向的第一台伺服器上的鍵會受到影響。
圖8 新增一台伺服器後受影響的鍵
一致性雜湊很大限度上抑制了鍵的重新分布。
我們深入了解了memcached的內部實現原理,包括記憶體管理相關的slab allocation機制以及分布式演算法。slab allocation解決了外部碎片問題,同時也引入了內部碎片。memcached的分布式由客戶端實現,基於餘數的雜湊是最簡單的分布式演算法之一,一致性雜湊可以在很大程度上抑制鍵的重新分布。
Memcached 記憶體管理
memcached是乙個高效的分布式記憶體cache,了解memcached的記憶體管理機制,便於我們理解memcached,讓我們可以針對我們資料特點進行調優,讓其更好的為我所用。這裡簡單談一下我對 memcached的記憶體管理的一些認識,在沒有特別註明的情況下,這裡談到的memcached是1...
memcached記憶體管理
原文 基本概念 slab,page,chunk。slab,是乙個邏輯概念。它是在啟動memcached例項的時候預處理好的,每個slab對應乙個chunk size,也就是說不同slab有不同的chunk size。具體分配多少個slab由引數 f 增長因子 和 n chunk最小尺寸 決定的。pa...
Memcached記憶體管理模型與LRU演算法優化
memcached 採用的是 slab allocation 記憶體模型,如下圖 說明 1 最大記憶體預設64兆,通過 m調整,記憶體空間有slab class構成,記憶體以slab page為單位申請,分配到對應的slab class 2 slab page 最大1兆,由乙個或多個chunk組成 ...