最近手上某個項目跟新代碼,新的代碼里大量采用memcahce作為緩存。所以開始深入了解memcache的內存分配策略。以前就聽說有個PHP寫的memcache監控腳本,在網上搜索了一下,果斷下載下來用 memcache.php。
修改一下php文件代碼配置
1
2
3
4
|
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所緩存的數據上面。
開始查找問題~
從網上下載了一個memcached統計工具memcache-tool
在linux下運行 memcached-tool 127.0.0.1:11211
1
2
|
# 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.25
1
2
3
4
5
6
7
8
9
|
[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 的緩存數據 接口地址改為 11212
1
2
3
|
[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
1
2
3
4
5
|
[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。
ok,問題解決了
來源:http://my.oschina.net/u/231017/blog/303686