一、python-memcached的安装
这里列一个通过python获取memcached命中率的代码,该代码需要依赖python-memcached包文件,该包可以通过easy_install或pypi安装,也可以直接网官上下载源码包进行安装 。这里就以centos 下的easy_install为例:
[root@localhost ~]# easy_install python-memcached
Searching for python-memcached
Reading http://pypi.python.org/simple/python-memcached/
Reading http://www.tummy.com/Community/software/python-memcached/
Best match: python-memcached 1.53
Downloading http://ftp.tummy.com/pub/python-memcached/old-releases/python-memcached-1.53.tar.gz
Processing python-memcached-1.53.tar.gz
Running python-memcached-1.53/setup.py -q bdist_egg --dist-dir /tmp/easy_install-GukjRE/python-memcached-1.53/egg-dist-tmp-wDUrUa
warning: no files found matching '*.rst'
warning: no files found matching '*.txt'
warning: no files found matching 'MakeFile'
warning: no previously-included files matching '*.pyc' found anywhere in distribution
warning: no previously-included files matching '.gitignore' found anywhere in distribution
warning: no previously-included files matching '.DS_Store' found anywhere in distribution
zip_safe flag not set; analyzing archive contents...
Adding python-memcached 1.53 to easy-install.pth file
Installed /usr/lib/python2.6/site-packages/python_memcached-1.53-py2.6.egg
Processing dependencies for python-memcached
Finished processing dependencies for python-memcached
二、python统计memcache的命中率
安装完成后,就可以import该包进行python脚本的调用了,脚本如下 :
#!/usr/bin/env python
from __future__ import division
import memcache #导入memcache模块
host=['192.168.1.200:11211','192.168.1.201:11212'] #定义memcached服务器列表
mc=memcache.Client(host,debug=0)
stat=mc.get_stats()
for i in range(len(stat)):
host=stat[i][0].split(‘ ‘)[0] #获取服务器名字
get=int(stat[i][1]['cmd_get']) #获取get数
hit=int(stat[i][1]['get_hits']) #获取hit数
miss=int(stat[i][1]['get_misses']) #获取miss数
if get==0:
rate=0
else:
rate=hit/get*100
print ‘%st%.2f%%’%(host,rate)
三、相关拓展
使用python进行统计的代码是比较简洁的,当然也可以通过shell进行统计,这里再给出一个nagios下的一个shell版的memcached命中率统计的插件:
#!/bin/bash
###############################
#检查memcached的命中率
#加载nagios自带utils.sh
###############################
#source /usr/local/nagios/libexec/utils.sh
print_usage()
{
echo "check_memcached -H IP -P port -w warning -c critical"
}
###################
#获取命令行执行参数
###################
if [ $# == 0 ];then
print_usage;
exit;
else
while test -n "$1";do
case "$1" in
-H)
host=$2
shift
;;
-P)
port=$2
shift
;;
-w)
warning=$2
shift
;;
-c)
critical=$2
shift
;;
*)
echo "Unknown argument:$1"
print_usage
exit $STATE_UNKNOWN
;;
esac
shift
done
fi
########################
#function div_f()
#检查参数,返回两个数字比
########################
function div_f()
{
ref=`awk -v num_a=$1 -v num_b=$2 'BEGIN{printf "%0.2f n",num_a/num_b}'`;
echo $ref;
}
##################
#得到命中率函数
##################
function getMemcachedHits()
{
memcachedinfo=`/usr/local/nagios/libexec/check_tcp -H $host -p $port -E -s 'statsrnquitrn' -e 'uptime' | tr "r" "@"`
get_hits=`echo $memcachedinfo | grep -o "@ STAT get_hits [0-9]*"| awk '{print $4}'`
cmd_get=`echo $memcachedinfo | grep -o "@ STAT cmd_get [0-9]*"| awk '{print $4}'`
div_f $get_hits $cmd_get;
}
hits=`getMemcachedHits $host $port`;
##################
#得到命中率所在区间
##################
function re_rang()
{
rang=$hits;
interval_a=$critical;
interval_b=$warningl
if [[ $rang < $interval_a ]];then
echo "0";
elif [[ $rang < $interval_b ]];then
echo "1";
elif [[ $rang > $interval_b ]]||[[ $rang == $interval_b ]] ;then
echo "2";
else
return;
fi
}
res=`re_rang $critical $warning $hits`;
case "$res" in
0)
echo "Critical memcached_hits=$hits|memcached_hits=$hits;$warning;$critical;"
exit $STATE_CRITICAL
;;
1)
echo "Warning memcached_hits=$hits|memcached_hits=$hits;$warning;$critical;"
exit $STATE_WARNING
;;
2)
echo "Ok memcached_hits=$hits|memcached_hits=$hits;$warning;$critical;"
exit $STATE_OK
;;
*)
echo "Unkown"
exit $STATE_UNKNOWN
;;
esac