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規格是固定的,如果用戶數據放進來后還有剩余則這剩余部分不能做其他用途。
工作流程: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上,內存浪費較少。
本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!