在改章节中,我们要主介绍指令脚本的内容,自我觉感有个不错的议建和大家分享下

近来一个月没啥新更,边身生发太多事,结业几年来霉运太多,虽然不信命,但我信有些性命的确好,有些性命的确差,其它不说也罢。(大家定一要意注身材啊,康健比任何西东都主要)

本文要监控的这个脚本,是在一个月前阁下,对于线上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说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")

指令脚本redis线上环境监控脚本(python脚本)相关推荐

  1. 记一次线上环境 redis偶尔连接超时报错 解决

    记一次线上环境 redis偶尔连接超时报错 解决 贴出本地控制台日志 说实话,很痛苦,跟进很久了,一直认为的jvm程序所使用的配置的连接池框架问题 因为程序为 springboot 2 spring ...

  2. 记几次 [线上环境] Dubbo 线程池占满原因分析(第三次:GC STW)

    [线上环境] Dubbo 线程池占满原因排查系列 记几次 [线上环境] Dubbo 线程池占满原因分析(第一次:HttpClient) 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:C ...

  3. 【原创】线上环境 SYN flooding 问题排查

    问题描述:        线上环境中,公司自研即时通讯软件不定时掉线. 问题排查:        由运维和测试人员发现并报告,线上环境出现网络异常,具体表现为登录服务器虚拟 IP 地址无法 ping ...

  4. 生产环境和开发环境_环境部署:开发、测试和线上环境的区别

    点击蓝字 关注我们 软件开发环境(Software Development Environment,SDE)是指在基本硬件和宿主软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件 ...

  5. 线上环境频繁GC问题排查,Finalizer对象该背这个锅吗?

    问题描述 公司的一个SpringMVC服务,最近在做运维检查的时候发现young gc 和 full gc太频繁,远远超过了正常情况.服务器配置是4核8G,该服务分配了6G内存.通过arthas的da ...

  6. 面试官:线上环境 FGC 频繁,如何解决?

    前言 这个问题应该是 Java 面试中很经常被问到的一个题目,很多人害怕这个题目. 因为大部分人可能在工作中根本遇不到 FGC 频繁的问题,即使从网上背了点答案,心里也不踏实,因为毕竟不是自己亲自接触 ...

  7. JVM第六讲:线上环境 FGC 频繁,如何解决?

    本文是JVM第六讲:线上环境 FGC 频繁,如何解决?重点:得靠经验来解决 文章目录 1.问题背景 2.遇到的问题及解决方案 2.1.pinpoint 打点存在大批量300ms以上 2.2.应用 cp ...

  8. node开发环境(mac)和线上环境(linux)搭建

    以前一直在做php后台,对node没有认真研究,现在前端发展速度这么快,再加上node的飞速发展,javascript统一中原指日可待啊.em~~,废话不多说开始开发环境和线上环境搭建吧,写一下自己的 ...

  9. 线上环境HBASE-1.2.0出现oldWALs无法自动回收情况;

    正常情况下,hmaster会定期清理oldWALs文件夹,一般该文件大小也就几百兆,但是我们线上 环境出现了该文件没有自动回收情况,如图: 该目录占用hdfs空间多达7.6T,浪费空间: 后来经过多番 ...

最新文章

  1. linux视频教程之进程管理
  2. 初学Vue 遇到Module not found:Error:Can`t resolve 'less-loader' 问题
  3. MySQL及其分支或衍生版
  4. python输入代码如何清除_Bug清除手册-代码书写规范与基本使用(Python)
  5. Spring Boot————BeanCreationNotAllowedException异常分析
  6. 云服务器布置_如何选择云服务器 云服务器配置怎么搭配【详解】
  7. 开源项目ActiveAndroid简述增、删、改、查
  8. Debian 7 Wheezy 安装 VirtualBox
  9. openstack部署过程中问题记录
  10. 如何在虚拟机下安装一个Linux操作系统?(简简单单30步,安装Linux详细教程)
  11. IT行业常见职位英语缩写及中文释义
  12. js生成execl表格
  13. linux 云锁 端口,问一下,云锁安装后还可以修改端口吗?
  14. 微软官方Windows7 Ultimate with SP1 DVD 官方简体中文原版下载
  15. iframe预览文件
  16. L2CAP数据发送和接收
  17. 大数据时代,传输软件的优势与应用
  18. 第1关:启动 MongoDB
  19. 苹果8屏幕测试软件,iPhone8人脸识别软件
  20. ora-01172 ora-01151的处理

热门文章

  1. Java中的SOAP技术
  2. Java垃圾回收GC概览
  3. fvdm 跟驰模型 matlab仿真_MATLAB数值计算在光学仿真和教学中的应用
  4. mysql返回对象_使用mysql_fetch_object()以对象的形式返回查询结果
  5. bash 将二进制转换为十进制_用‘栈的思想编写一个十进制转换二进制、八进制或十六进制的程序...
  6. Java Socket缓冲区
  7. 腾讯地图api-地图展示map和覆盖物(标记)
  8. Percona Server
  9. python chmod 批量 os_Python3 os.lchmod() 方法
  10. 使用jsp页面查看jvm使用情况