Memcache 提升緩存命中率

最近手上某個項目跟新代碼,新的代碼裏大量採用memcahce做爲緩存。因此開始深刻了解memcache的內存分配策略。之前就據說有個PHP寫的memcache監控腳本,在網上搜索了一下,果斷下載下來用 memcache.php
修改一下php文件代碼配置php

define(‘ADMIN_USERNAME’,'admin’);
define(‘ADMIN_PASSWORD’,'admin’);
$MEMCACHE_SERVERS[] = ’127.0.0.1:11211′;
$MEMCACHE_SERVERS[] = ’127.0.0.1:11212′;//能夠多個監控

問題出現了
發現命中率 以天天0.5%的速度降低 從原來的97%降低到了94%。
Misses 的個數增加飛快。
從監控的Variables看出,幾乎全部的items都集中在slab2裏,有將近8737個Item。
那麼問題確定出如今slab2所緩存的數據上面。linux

開始查找問題~
從網上下載了一個memcached統計工具memcache-tool
在linux下運行 memcached-tool 127.0.0.1:11211緩存

#        Item_Size    Max_age     Pages       Count       Full?      Evicted  
slabId   chunk的大小   生命週期   page數量    緩存項個數    是否已滿    被註銷數?

看來slab 2 類的 page 數據儲存已滿 ,但page的個數並無增長,count已達到8738.
memcache守護進程爲
memcached -d -m 10 -u root -p 11211
分配的內存只有10M , Chunk的Size 的倍數因子 -f 爲默認的1.25memcached

[root@]# memcached -u root -vv
slab class   1: chunk size        96 perslab   10922
slab class   2: chunk size       120 perslab    8738
slab class   3: chunk size       152 perslab    6898
slab class   4: chunk size       192 perslab    5461
slab class   5: chunk size       240 perslab    4369
slab class   6: chunk size       304 perslab    3449
slab class   7: chunk size       384 perslab    2730
slab class   8: chunk size       480 perslab    2184

0M的內存分給了過多的 slab,致使每一個slab的pages 最多隻能有1個,沒法增長pages。
slab2的 count 已經達到了所能容納的最高值8738。不斷的有緩存數據被Evicted。工具

解決問題
新開一個memcache守護進程
memcached -d -m 10 -f 2 -u root -p 11212
在項目代碼中將全部使用memcache 11211 slab2 的緩存數據 接口地址改成 11212spa

[root@ ~]# /home/duyumi/memcached-tool 127.0.0.1:11212
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  2     192B      5190s       2    8001      no        0        0    0

pages數增長爲2,count達到了8001,並無full,一個page的最大chunk爲5461,每一個chunk的大小爲192B.net

[root@ ~]# memcached -u root -f 2 -vv
slab class   1: chunk size        96 perslab   10922
slab class   2: chunk size       192 perslab    5461
slab class   3: chunk size       384 perslab    2730
....

緩存項並無被Evicted。code

ok,問題解決了orm

相關文章
相關標籤/搜索