轉(zhuǎn)載:https://my.oschina.net/liuxd/blog/63129
工作原理
基本概念:slab,page,chunk。
slab,是一個(gè)邏輯概念。它是在啟動(dòng)memcached實(shí)例的時(shí)候預(yù)處理好的,每個(gè)slab對(duì)應(yīng)一個(gè)chunk size,也就是說(shuō)不同slab有不同的chunk size。具體分配多少個(gè)slab由參數(shù) -f (增長(zhǎng)因子)和 -n (chunk最小尺寸)決定的。
page,可以理解為內(nèi)存頁(yè)。大小固定為1m。slab會(huì)在存儲(chǔ)請(qǐng)求時(shí)向系統(tǒng)申請(qǐng)page,并將page按chunk size進(jìn)行切割。
chunk,是保存用戶數(shù)據(jù)的最小單位。用戶數(shù)據(jù)item(包括key,value)最終會(huì)保存到chunk內(nèi)。chunk規(guī)格是固定的,如果用戶數(shù)據(jù)放進(jìn)來(lái)后還有剩余則這剩余部分不能做其他用途。
工作流程:memcahed實(shí)例啟動(dòng),根據(jù) -f 和 -n 進(jìn)行預(yù)分配slab。以 -n 為最小值開(kāi)始,以 -f 為比值生成等比數(shù)列,直到1m為止(每個(gè)slab的chunk size都要按8的倍數(shù)進(jìn)行補(bǔ)全,比如:如果按比值算是556的話,會(huì)再加4到560成為8的整倍數(shù))。然后每個(gè)slab分配一個(gè)page。當(dāng)用戶發(fā)來(lái)存儲(chǔ)請(qǐng)求時(shí)(key,value),memcached會(huì)計(jì)算key+value的大小,看看屬于哪個(gè)slab。確定slab后看里面的是否有空閑chunk放key+value,如果不夠就再向系統(tǒng)申請(qǐng)一個(gè)page(如果此時(shí)已經(jīng)達(dá)到 -m 參數(shù)設(shè)置的內(nèi)存使用上限,則看是否設(shè)置了 -M 。如果設(shè)置了 -M 則返回錯(cuò)誤提示,否則按LRU算法刪除數(shù)據(jù))。申請(qǐng)后將該page按本slab的chunk size 進(jìn)行切割,然后分配一個(gè)來(lái)存放用戶數(shù)據(jù)。
注意:
1,chunk是在page里面劃分的,而page固定為1m,所以chunk最大不能超過(guò)1m。
2,chunk實(shí)際占用內(nèi)存要加48B,因?yàn)閏hunk數(shù)據(jù)結(jié)構(gòu)本身需要占用48B。
3,如果用戶數(shù)據(jù)大于1m,則memcached會(huì)將其切割,放到多個(gè)chunk內(nèi)。
4,已分配出去的page不能回收。
優(yōu)化建議
1,-n 參數(shù)的設(shè)置,注意將此參數(shù)設(shè)置為1024可以整除的數(shù)(還要考慮48B的差值),否則余下來(lái)的部分就浪費(fèi)了。
2,不要存儲(chǔ)超過(guò)1m的數(shù)據(jù)。因?yàn)橐鸪啥鄠€(gè)chunk,計(jì)算和時(shí)間成本都成倍增加。
3,善用stats命令查看memcached狀態(tài)。
4,消滅eviction(被刪除的數(shù)據(jù))。造成eviction是因?yàn)閮?nèi)存不夠,有三個(gè)思路:一是在CPU有余力的情況下開(kāi)啟壓縮(php擴(kuò)展);二是增加內(nèi)存;三是調(diào)整 -f 參數(shù),減少內(nèi)存浪費(fèi)。
5,調(diào)整業(yè)務(wù)代碼,提高命中率。
6,緩存小數(shù)據(jù)。省帶寬,省網(wǎng)絡(luò)I/O時(shí)間,省內(nèi)存。
7,根據(jù)業(yè)務(wù)特點(diǎn),為數(shù)據(jù)尺寸區(qū)間小的業(yè)務(wù)分配專用的memcached實(shí)例。這樣可以調(diào)小 -f 參數(shù),使數(shù)據(jù)集中存在少數(shù)幾個(gè)slab上,內(nèi)存浪費(fèi)較少。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注