mecached記憶體管理與原理

2022-08-19 10:21:11 字數 2639 閱讀 5279

許多web應用程式都將資料儲存到rdbms中,應用伺服器從中讀取資料並在瀏覽器中顯示。但隨著資料量的增大,訪問的集中,就會出現rebms的負擔加重,資料庫響應惡化,**顯示延遲等重大影響。memcached是高效能的分布式記憶體快取伺服器。一般的使用目的是通過快取資料庫查詢結果,減少資料庫的訪問次數,以提高動態web應用的速度、提高擴充套件性。如圖:

memcached 的特點:

memcached 作為高速執行的分布式快取伺服器具有以下特點。

協議簡單:memcached 的伺服器客戶端通訊並不使用複雜的mxl等格式,而是使用簡單的基於文字的協議。

基於libevent 的事件處理:libevent 是個程式庫,他將linux 的epoll 、bsd類作業系統的kqueue 等時間處理功能封裝成統一的介面。 memcached使用這個libevent庫,因此能在linux、bsd、solaris等作業系統上發揮其高效能。

內建記憶體儲存方式:為了提高效能,memcached中儲存的資料都儲存在memcached內建的記憶體儲存空間中。由於資料僅存在於記憶體中,因此重啟memcached,重啟作業系統會導致全部資料消失。另外,內容容量達到指定的值之後memcached回自動刪除不適用的快取。

memcached 不互通訊的分布式:memcached儘管是「分布式」快取伺服器,但伺服器端並沒有分布式功能。各個memcached不會互相通訊以共享資訊。他的分布式主要是通過客戶端實現的。

memcached 的記憶體管理

最近的memcached 預設情況下採用了名為slab allocatoion的機制分配,管理記憶體。在改機制出現以前,記憶體的分配是通過對所有記錄簡單地進行malloc 和free來進行的。但是這中方式會導致記憶體碎片,加重作業系統記憶體管理器的負擔。

slab allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,已完全解決記憶體碎片問題。slab allocation 的原理相當簡單。將分配的記憶體分割成各種尺寸的塊(chucnk),並把尺寸相同的塊分成組(chucnk 的集合)如圖:

而且slab allocator 還有重複使用已分配記憶體的目的。也就是說,分配到的記憶體不會釋放,而是重複利用。

slab allocation 的主要術語

page :分配給slab 的記憶體空間,預設是1mb。分配給slab 之後根據slab 的大小切分成chunk.

chunk : 用於快取記錄的記憶體空間。

slab class:特定大小的chunk 的組。

在slab 中快取記錄的原理

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

memcached 在資料刪除方面有效裡利用資源

memcached 刪除資料時資料不會真正從memcached 中消失。memcached不會釋放已分配的記憶體。記錄超時後,客戶端就無法再看見該記錄(invisible 透明),其儲存空間即可重複使用。

lazy expriation memcached 內部不會監視記錄是否過期,而是在get時檢視記錄的時間戳,檢查記錄是否過期。這種技術稱為lazy expiration.因此memcached 不會再過期監視上耗費cpu時間。

lru:從快取中有效刪除資料的原理 :memcached 會優先使用已超時的記錄空間,但即使如此,也會發生追加新紀錄時空間不足的情況。此時就要使用名為least recently used (lru)機制來分配空間。這就是刪除最少使用的記錄的機制。因此當memcached 的記憶體空間不足時(無法從slab class)獲取到新空間時,就從最近未使用的記錄中搜尋,並將空間分配給新的記錄。

memcached 分布式

memcached 雖然稱為「分布式「快取伺服器,但伺服器端並沒有「分布式」的功能。memcached的分布式完全是有客戶端實現的。現在我們就看一下memcached 是怎麼實現分布式快取的。

例: 下面假設memcached伺服器有node1~node3三颱,應用程式要儲存鍵名為「tokyo」「kanagawa」「chiba」「saitama」「gunma」 的資料。

同樣,「kanagawa」「chiba」「saitama」「gunma」都是先選擇伺服器再儲存。

接下來獲取儲存的資料。獲取時也要將要獲取的鍵「tokyo」傳遞給函式庫。函式庫通過與資料儲存時相同的演算法,根據「鍵」選擇伺服器。使用的演算法相同,就能選中與儲存時相同的伺服器,然後傳送get命令。只要資料沒有因為某些原因被刪除,就能獲得儲存的值。

這樣,將不同的鍵儲存到不同的伺服器上,就實現了memcached的分布式。 memcached伺服器增多後,鍵就會分散,即使一台memcached伺服器發生故障無法連線,也不會影響其他的快取,系統依然能繼續執行。

window記憶體管理與記憶體原理

windows為每個程序分配了4gb的虛擬位址空間,讓每個程序都認為自己擁有4gb的記憶體空間,4gb怎麼來的?32位 cpu可以取位址的空間為2的32次方,就是4gb 正如16位cpu有20根定址線所有擁有2的20次方的定址空間一樣 當我們在windows中雙擊乙個應用程式圖示後,系統為該應用程式...

Windows記憶體原理與記憶體管理

windows為每個程序分配了4gb的虛擬位址空間,讓每個程序都認為自己擁有4gb的記憶體空間,4gb怎麼來的?32位 cpu可以取位址的空間為2的32次方,就是4gb 正如16位cpu有20根定址線所有擁有2的20次方的定址空間一樣 當我們在windows中雙擊乙個應用程式圖示後,系統為該應用程式...

Memcached工作原理以及記憶體管理

memcached工作原理 包括服務端和客戶端,以鍵值對的形式儲存。key根據乙個 hash 演算法得到乙個 hashkey 根據這個值來確定選擇哪台伺服器儲存。客戶端根據 key的值用相同的方法計算出 hash 值,確定是哪個伺服器,然後進行連線,獲取 value值 快取策略 當服務端的hash ...