本文共 5381 字,大约阅读时间需要 17 分钟。
单个服务器上创建多实例,对其重要参数的监控是非常重要的,以下是监控服务器上多实例的负载情况:主要包含:redis实例的QPS、内存使用情况、客户端连接数,服务器的内存使用率、CPU使用率、CPU load值、网卡流量等,脚本把采集到的数据显示并且写入到数据库中,方便查看多个服务器的多实例情况以及数据的汇总等,写的优点仓促,有兴趣的同学可以整理一下脚本使其模块化、简洁化。脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #!/usr/bin/env python #-*-coding:UTF-8-*- import os,threading,time,sys,sigar,MySQLdb ''' 安装python的sigar模块 apt-get install libtool automake gettext python-MySQLdb screen pkg-config git git clone git://github.com/hyperic/sigar.git sigar.git ./autogen.sh ./configure make make install cd bindings/python/ python setup.py install ''' ''' 建库sql CREATE TABLE `redis_stats` ( `id` int(11) NOT NULL AUTO_INCREMENT, `host_name` varchar(50) NOT NULL, `qps` int(11) NOT NULL, `clients` int(11) NOT NULL, `redis_mem_used` varchar(50) NOT NULL, `sys_mem_used_pers` float NOT NULL, `cpu_used` float NOT NULL, `cpu_load` varchar(50) NOT NULL, `netband` varchar(255) NOT NULL, `uptime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `host_name` (`host_name`), KEY `uptime` (`uptime`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 查询每个实例的最新记录 select host_name,qps,clients,redis_mem_used,concat(sys_mem_used_pers,'%') as sys_mem_used,concat(cpu_used,'%') as cpu_used,cpu_load,netband from DBA.redis_stats group by host_name desc order by qps desc; ''' def log2db(check_log): log_host = '192.168.56.101' log_user = 'root' log_pass = '1q2w3e4r' try : conn = MySQLdb.connect(host = log_host,port = 3306 ,user = log_user,passwd = log_pass,charset = 'utf8' ,connect_timeout = 20 ) cursor = conn.cursor() #cursor.execute(insert_sql) cursor.executemany( "INSERT INTO redis.redis_stats (`host_name`,`qps`,`clients`,`redis_mem_used`,`sys_mem_used_pers`,`cpu_used`,`cpu_load`,`netband`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)" , tuple (check_log)) conn.commit() cursor.close() conn.close() except Exception,e: print e def redis_info(host,port,res): var = [] var.append(host) var.append(port) aaa = os.popen( "redis-cli -h %s -p %s info|grep -v '#'|tr -s '\r\n'" % (host,port)).readlines() dirc = {} for i in aaa: if i ! = '\r\n' : a = i.strip() aa = a.split( ":" ) dirc[aa[ 0 ]] = aa[ 1 ] var.append(dirc[ "connected_clients" ]) var.append(dirc[ "instantaneous_ops_per_sec" ]) var.append(dirc[ "used_memory_human" ]) res.append(var) def main(): netband = {} stime = 5 while True : try : sg = sigar. open () mem = sg.mem() #内存 mem_percent = "%.2f" % mem.used_percent() cpu = sg.cpu() #CPU总的使用率 cpu_idle = "%.2f" % (( 1 - float (cpu.idle()) / cpu.total()) * 100 ) loadavg = sg.loadavg() #CPU load值 cpu_loadavg = ',' .join([ str (i) for i in loadavg]) #nets = [i for i in sg.net_interface_list() if 'dum' not in i and i != 'lo']#网卡流量统计 nets = [i.strip() for i in os.popen( "/bin/ip a|grep global|awk '{print $7}'" ).readlines() if i.strip() ! = ''] if len (netband) ! = 0 : for net in nets: netband[net + '_Out' ] = "%.2f" % ( float ((sg.net_interface_stat(net).tx_bytes()) - int (netband[net + '_Out' ])) / stime / 1024 / 1024 ) netband[net + '_In' ] = "%.2f" % ( float ((sg.net_interface_stat(net).rx_bytes()) - int (netband[net + '_In' ])) / stime / 1024 / 1024 ) else : for net in nets: netband[net + '_Out' ] = "%.2f" % ( float (sg.net_interface_stat(net).tx_bytes()) / stime / 1024 / 1024 ) netband[net + '_In' ] = "%.2f" % ( float (sg.net_interface_stat(net).rx_bytes()) / stime / 1024 / 1024 ) redis_list = [ '192.168.56.101:6379' , '192.168.1.87:16379' ] text = "*" * 20 + " Redis Status %s " % time.strftime( "%Y-%m-%d %H:%M:%S" ) + "*" * 20 print "\033[1;31;40m%s\033[0m" % text threads = [] res = [] for i in redis_list: aa = i.split( ':' ) host = aa[ 0 ] port = aa[ 1 ] t = threading.Thread(target = redis_info,args = (host,port,res)) threads.append(t) for i in range ( len (threads)): threads[i].start() for i in range ( len (threads)): threads[i].join() print "\033[1;35;40m%s\033[0m" % ( "Redis_host:port" .ljust( 23 ) + "Redis:QPS" .ljust( 10 ) + "Redis:Clients" .ljust( 15 ) + "Redis:Mem_used" .ljust( 15 ) + "Mem_percent" .ljust( 12 ) + "Cpu_used" .ljust( 10 ) + "Cpu_loadavg" .ljust( 17 )) All_qps = 0 All_clients = 0 res.sort() check_log = [] for i in res: log = [i[ 0 ] + ':' + i[ 1 ], int (i[ 3 ]), int (i[ 2 ]),i[ 4 ], float (mem_percent), float (cpu_idle),cpu_loadavg, str (netband)] check_log.append(log) print (i[ 0 ] + ':' + i[ 1 ]).ljust( 23 ) + i[ 3 ].ljust( 10 ) + i[ 2 ].ljust( 15 ) + i[ 4 ].ljust( 15 ) + mem_percent.ljust( 12 ) + cpu_idle.ljust( 10 ) + cpu_loadavg.ljust( 17 ) + str (netband) All_qps = All_qps + int (i[ 3 ]) All_clients = All_clients + int (i[ 2 ]) log2db(check_log) print "\033[1;35;40m%s\033[0m" % ( "Summary All host:" .ljust( 23 ) + str (All_qps).ljust( 10 ) + str (All_clients).ljust( 10 )) netband = {} for net in nets: netband[net + '_Out' ] = sg.net_interface_stat(net).tx_bytes() netband[net + '_In' ] = sg.net_interface_stat(net).rx_bytes() time.sleep(stime) except KeyboardInterrupt : sys.exit( 0 ) print break if __name__ = = "__main__" : main() |
有图有真相:
本文转自 lover00751CTO博客,原文链接:http://blog.51cto.com/wangwei007/1352169,如需转载请自行联系原作者