memcache有时候会失效,存不了取不了,但是shell进去set a 然后get a又正常,其实是有可能是某个trunk满了
memcache里面有很多slab ,slab是固定chunk的size集合,slab之间是1.5倍的关系(可以指定),slab里面有很多page,page是1M的内存,slab申请page后会划分成很多chunk,当-M的内存都被申请了之后,slab的chunk基本固定了,重启之前应该是不会改变了,如果某个slab满了那就存不进去某一大小的数据了,而你测试的key并一定在这个slab里面
所以写了一段很low的代码监控一下chunk的状况
用shell写可以,感觉python处理字符简单省事一点。
代码如下
记得给我宝贵意见:
#!/usr/bin/env python
'''
auth yufei
2016-2-3
分析memcache用量并短信通知
'''
import os,subprocess,re
import time
import urllib
import urllib2
def fails(phone):
phone=phone
host="web1-memcache"
times=time.strftime('%Y-%m-%d_%H:%M:%S',time.localtime(time.time()))
test_data = {'tplid':'1','ip':host,'s':'memcache-mem','time':times,'phone':phone,'check':0}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "http://api.goodid.com/sendMsg"
req = urllib2.Request(url = requrl,data =test_data_urlencode)
print req
res_data = urllib2.urlopen(req)
res = res_data.read()
print res
p = subprocess.Popen("echo 'stats slabs' | nc 10.1.1.55 11200", shell=True, stdout=subprocess.PIPE)
out = p.stdout.readlines()
totlschunkslist = []
usedschunkslist = []
for line in out:
getline = line.strip()
TotalChunks=re.match(r'.*total_chunks (.*)', getline)
UsedChunks=re.match(r'.*used_chunks (.*)', getline)
if TotalChunks:
TotalChunks=TotalChunks.group(1)
totlschunkslist.append(TotalChunks)
if UsedChunks:
UsedChunks=UsedChunks.group(1)
usedschunkslist.append(UsedChunks)
for i, j in enumerate(totlschunkslist):
print totlschunkslist[i],usedschunkslist[i]
if int(totlschunkslist[i]) >= 30:
bads = int(totlschunkslist[i]) / 2
if int(usedschunkslist[i]) >= bads:
limitt = float(usedschunkslist[i]) / float(totlschunkslist[i])
print "userd:",limitt
if limitt >= 0.95:
print "It's already full."
p = subprocess.Popen("echo 'flush_all' | nc 10.1.1.55 11200", shell=True, stdout=subprocess.PIPE)
out = p.stdout.readlines()
print out
fails("17700008888")
#p = subprocess.Popen("echo 'flush_all' | nc 10.26.243.55 11211", shell=True, stdout=subprocess.PIPE)
break
在我们网站用了,感觉还行,避免了两次memcache失效情况