利用python监控memcache用量

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失效情况

猜你喜欢

转载自blog.csdn.net/yufei6808/article/details/80662491
今日推荐