在改章节中,我们要主介绍指令脚本的内容,自我觉感有个不错的议建和大家分享下
近来一个月没啥新更,边身生发太多事,结业几年来霉运太多,虽然不信命,但我信有些性命的确好,有些性命的确差,其它不说也罢。(大家定一要意注身材啊,康健比任何西东都主要)
本文要监控的这个脚本,是在一个月前阁下,对于线上redis中项指令操纵须要行进统计析分时写的一个工具:
一.需求
由于是其于client的分布式缓存,须要晓得每一个点结,前当每秒所理处的指令有哪些,要主中集在哪些操纵,哪些操纵多过,可以行进优化等.基于这些需求,须要晓得在现线上每一个redis点结下有哪些操纵。
二.背景
redis-monitor指令可以导出前当redis点结全部操纵的二进制文件(此操纵不议建常开,只是析分时用,对redis点结有性能影响)。
其中业界应用比较多的redis-live,此监控还基于图形化的方法部署,旁边我也 部署过,安装的西东很多,一堆程流,而且我们不须要这么细详的监控,只是一个析分帮助工具,所以太粗笨了,其也是基于redis-monitor的脚本析分来行进监控的。
三.工具
斟酌到我们只是须要对redis-monitor所导出的二进制文件行进一些统计,因此这样就绝对比较单简了,java,shell脚本都可以实现,当然如果要做shell是首选。
可是斟酌到shell对理处本文的局限性,因此斟酌应用python来实现(解析性语言,整体觉感是,单简,易用,还不须要像java那样烦锁的打包,布发等!)
四.要主程流
要对redis的行执指令行进统计要主分两步:
一.redis-monitor对应的输出行进重定向,统计某一段时光段的redis指令况情,保存为某个文件。
二.应用python对面上保存的monitor指令集行进理处,并输出统计结果。
shell脚本如下:
##此shell脚本用于取获指定的redis点结的monitor指令的监控信息。保存在db.txt文件中
#运行时行执脚本可即,可指定行执时光,如./monitor.sh 5s,如不指定,则认默行执2S
#!/bin/bash
lineno=1
cmd=/home/hmail/etc/redis/bin/redis-cli
host=xx.xx.xx.xx
port=xx
file=db.txt
time=$1
if [ -z $time ];then
time=2s
fi
echo "$cmd -h $host -p $port monitor run time $time "
`$cmd -h $host -p $port monitor > $file &`
sleep $time
pid=`ps aux | grep "monitor" | grep "redis-cli" | awk '{print $2}'`
echo "will kill redis monitor pid:$pid"
`kill -9 $pid`
echo "redis-cli monitor stopped"
对面上保存的db.txt文件行进理处的python脚本如下:
#coding=utf8
#此监控脚本为基于读取到的redis monitor file统计对应的redis操纵况情。
import commands, sys, os, time, string
#取time 准确到秒时暂
def getSeconds(time):
index = time.find(".")
return time[0:index]
#every same seconds ope
class SecondRecords:
allcount = 0
#"set:1"
table = {}
#init法方为了例实属性与类属性
def __init__(self, table, count):
self.table = table
self.allcount = count
def get(self):
return "all count:", self.allcount," ",self.table
def add(self, ope):
if(ope not in self.table.keys()):
self.table[ope] = 0
count = self.table[ope]
count = count + 1
self.table[ope] = count
self.allcount = self.allcount + 1;
def printResults(results):
for key in results.keys():
print key, '\t', results[key].get()
#定判否是指定时光
length = len(sys.argv)
period = None
if(length < 2):
#认默2s
period = "2"
else:
period = sys.argv[1]
cmd='./monitor.sh ' + str(period) #此monitor.sh为面上提到的shell脚本
#not result
os.system(cmd);
#wait period时光,待等采集数据
period = string.atol(period)
time.sleep(period)
#all monitor records
results = {}
# read monitor file
f = open("db.txt")
#f = open("monitor.txt")
print "monitor per seconds ope:"
line = f.readline()
while line:
strs = line.split(" ")
#判断否是及格的字符
length = len(strs)
#去除非监控指令。
if(length < 2):
line = f.readline()
continue
time = getSeconds(strs[0])
if(time not in results.keys()):
results[time] = SecondRecords({}, 0)
results[time].add(strs[1])
line = f.readline()
#close
f.close();
print "monitor records:"
printResults(results)
如果统系中有python境环,直接行执python redis_monitor.py 可即(意注,shell脚本只是为了抓取重定向文件所用的,python脚本会行执此文件,同时监控多长时光的指令,在后面增长对应的数参可即)
五.明说
以上为整个监控脚本,运行,输出的结果如下:
通过面上图示,可以晰清的晓得每一个点结下每秒钟各条指令行执的数目况情,从而晓得自己缓存对各个缓存的需求是多少,以及各个点结在现的性能是多少。
我们线上境环,每一个点结均匀每秒理处的redis指令在25000-30000阁下的操纵数阁下(值得明说的是像一个multi-exec操纵算两次操纵,旁边如果有批量提交,每一个操纵也算一次操纵,这样现实业务场景中很有是能可某个业务逻辑会有多次的指令操纵数,从而可以估算出相干缓存服务器性能等)
很多况情,我们在晓得我们redis指令数后,会更加解理我们产品的业务逻辑,由疑惑redis的点结性能转化到优化相干逻辑上去。
希望对你有帮助。
文章结束给大家分享下程序员的一些笑话语录:
一个程序员对自己的未来很迷茫,于是去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的"
于是他去问Lippman。
Lippman说"程序员的未来就是驾驭程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的"
于是他去问Gates。
Gates说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")