最近手上某個項目跟新代碼,新的代碼裏大量採用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