memcached記憶體管理

2021-09-02 10:07:42 字數 1306 閱讀 2718

原文:

基本概念:slab,page,chunk。

slab,是乙個邏輯概念。它是在啟動memcached例項的時候預處理好的,每個slab對應乙個chunk size,也就是說不同slab有不同的chunk size。具體分配多少個slab由引數 -f (增長因子)和 -n (chunk最小尺寸)決定的。

page,可以理解為記憶體頁。大小固定為1m。slab會在儲存請求時向系統申請page,並將page按chunk size進行切割。

chunk,是儲存使用者資料的最小單位。使用者資料item(包括key,value)最終會儲存到chunk內。chunk規格是固定的,如果使用者資料放進來後還有剩餘則這剩餘部分不能做其他用途。

工作流程:memcahed例項啟動,根據 -f 和 -n 進行預分配slab。以 -n 為最小值開始,以 -f 為比值生成等比數列,直到1m為止(每個slab的chunk size都要按8的倍數進行補全,比如:如果按比值算是556的話,會再加4到560成為8的整倍數)。然後每個slab分配乙個page。當使用者發來儲存請求時(key,value),memcached會計算key+value的大小,看看屬於哪個slab。確定slab後看裡面的是否有空閒chunk放key+value,如果不夠就再向系統申請乙個page(如果此時已經達到 -m 引數設定的記憶體使用上限,則看是否設定了 -m 。如果設定了 -m 則返回錯誤提示,否則按lru演算法刪除資料)。申請後將該page按本slab的chunk size 進行切割,然後分配乙個來存放使用者資料。

注意:1,chunk是在page裡面劃分的,而page固定為1m,所以chunk最大不能超過1m。

2,chunk實際占用記憶體要加48b,因為chunk資料結構本身需要占用48b。

3,如果使用者資料大於1m,則memcached會將其切割,放到多個chunk內。

4,已分配出去的page不能**。

優化建議

1,-n 引數的設定,注意將此引數設定為1024可以整除的數(還要考慮48b的差值),否則餘下來的部分就浪費了。

2,不要儲存超過1m的資料。因為要拆成多個chunk,計算和時間成本都成倍增加。

3,善用stats命令檢視memcached狀態。

4,消滅eviction(被刪除的資料)。造成eviction是因為記憶體不夠,有三個思路:一是在cpu有餘力的情況下開啟壓縮(php擴充套件);二是增加記憶體;三是調整 -f 引數,減少記憶體浪費。

5,調整業務**,提高命中率。

6,快取小資料。省頻寬,省網路i/o時間,省記憶體。

7,根據業務特點,為資料尺寸區間小的業務分配專用的memcached例項。這樣可以調小 -f 引數,使資料集中存在少數幾個slab上,記憶體浪費較少。

Memcached 記憶體管理

memcached是乙個高效的分布式記憶體cache,了解memcached的記憶體管理機制,便於我們理解memcached,讓我們可以針對我們資料特點進行調優,讓其更好的為我所用。這裡簡單談一下我對 memcached的記憶體管理的一些認識,在沒有特別註明的情況下,這裡談到的memcached是1...

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

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

Memcached記憶體管理模型與LRU演算法優化

memcached 採用的是 slab allocation 記憶體模型,如下圖 說明 1 最大記憶體預設64兆,通過 m調整,記憶體空間有slab class構成,記憶體以slab page為單位申請,分配到對應的slab class 2 slab page 最大1兆,由乙個或多個chunk組成 ...