Memcache 優化建議

1、memcached工做原理

基本概念: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規格是固定的,若是用戶數據放進來後還有剩餘則這剩餘部分不能作其餘用途。

2、memcached工做流程

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不能回收。

3、優化建議

1,-n 參數的設置,注意將此參數設置爲1024能夠整除的數(還要考慮48B的差值),不然餘下來的部分就浪費了。
2,不要存儲超過1m的數據。由於要拆成多個chunk,計算和時間成本都成倍增長。
3,善用stats命令查看memcached狀態。
4,消滅eviction(被刪除的數據)。
形成eviction是由於內存不夠,有三個思路:
一是在CPU有餘力的狀況下開啓壓縮(PHP擴展);
二是增長內存;
三是調整-f參數,減小內存浪費。
5,調整業務代碼,提升命中率。
6,緩存小數據。省帶寬,省網絡I/O時間,省內存。
7,根據業務特色,爲數據尺寸區間小的業務分配專用的memcached實例。這樣能夠調小 -f 參數,使數據集中存在少數幾個slab上,內存浪費較少。

啓動時最重要的參數:

-m  整個memcached最大內存
-f  chunk大小增加因子
-n  chunk最小分配空間
-C  禁用CAS
-vvv 打印詳細信息
咱們經過計算能夠看出,每一個slab的chunk size大小都是上一個大小的1.25倍,1.25就是memcached啓動時制定的-f的值,因此,要根據不一樣的業務場景調整,既要儘量少的減小內存浪費,又要存得下咱們業務中的數據,再舉個例子,加入咱們的業務很BT,大小都是200kb,咱們該怎麼作?那固然是要保證咱們申請的chunk大小都是200kb了,雖然memcached並不支持這麼作。假如建立了38個slabs,最後數據全都落到了第20-25個slab中,那0-19和26-38的內存就被浪費了,這只是能評估出來的,還有一種狀況,加入咱們的chunk大小是500kb,數據才200kb,由於每一個chunk都只能存儲一個,因此一個chunk就會有500kb-200kb的空間浪費,若是有一千萬個chunk要存,那將會浪費多少空間?因此,在使用memcached以前,先要評估你的數據,根據它去調整-f因子。














相關文章
相關標籤/搜索