2017-05-23 DBA日记,使用python巧妙分析listener的log.xml,为连接泄漏提供数据支持

来源:互联网 发布:手机淘宝叫快递 编辑:程序博客网 时间:2024/06/04 19:42
背景:
通过观察数据库指标监控平台,发现数据库logon/s 为1.5个,并且出现在业务低峰期。因此怀疑中间件或程序代码出现连接泄密问题,所以需要进一步分析。
分析:
具体描述(S):在每天6-9点,数据库db1上发现logon/s 为1.5个。
收集数据(G-gather):下载listener的log.xml(该文件记录了什么时候,什么IP连接到数据库主机上,连接状态:是否成功连接)到本地进行分析,该文件是是一个非结构化文件,为了方便统计分析,我使用python稍作处理——统计同一IP,连接数据库的次数。处理后数据如下:
IP 连接次数
192.168.1.1 1000
192.168.1.2 800
192.168.1.3 700
192.168.1.4 500
192.168.1.5 1
分析(A):按照“找特例”的方法,首先把192.168.1.1这个标本取出来,进行第二轮分析。
第二轮分析:
具体描述:192.168.1.1这个服务器在3小时以内,产生了1000个新建连接的请求。
收集数据:1)向192.168.1.1的中间件管理员,描述该问题,并请求协助收集数据。如中间件中关于连接池的配置信息。根据中间件管理员的描述在该服务器上的中间件类型jboss,它的连接池属性是最小连接数配置3,最大是10,另一数据源的连接属性是最小连接数配置20,最大是100。 其中有一个关键属性<idle-timeout-minutes> 2 </idle-timeout-minutes>
2) 通过查询数据库gv$session确认是否确实有此多的会话,结果,数据为上只有80多个连接。
分析:在JBOSS配置属性<idle-timeout-minutes>,当连接池空闲会话超过2分钟后,自动回收,所以在闲时,会把所有会话回收,同时又配置了最小连接数,所以,最极端情况,把所有连接销毁,又立刻创建新连接。

结论:
由于JBOSS配置属性<idle-timeout-minutes>配置不恰当,导致连接泄漏。目前建议配置为30分钟。

附录:python分析脚本:
#-*-coding:utf-8 -*-'''分析oracle实例的监听器的log.xml,分析主题如下1. 找出一定时间内,统计app IP产生新连接数据库的次数'''from bs4 import BeautifulSoupimport redef SortList(l1):max_value=0position=0new_l1=[]while (True):if len(l1)==0:breakif len(l1)==1:position=0new_l1.append(l1[position])l1.pop(position)breakmax_value=l1[0][1]for j in range(len(l1)):if l1[j][1]>=max_value:max_value=l1[j][1]position=jtry:new_l1.append(l1[position])l1.pop(position)except:print 'error',position,l1[position-1]print len(l1)return new_l1if __name__ == '__main__':print 'running............'xml=open(r'D:\log.xml','r')contents=xml.readlines()l_ip=[]l_full_ip=[]fmat_c=''for i in contents:fmat_c=fmat_c+i#print contentsprint "read file successful"bs=BeautifulSoup(fmat_c,"html5lib",from_encoding="UTF8")print "format file successful"txt=bs.find_all('txt')for i in txt:found=0result=re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',i.string)if len(result)>0:#print result[0]#l_ip.append(result[0])try:for j in range(len(l_ip)):if result[0]==l_ip[j][0]:l_ip[j][1]=l_ip[j][1]+1found=1breakif found==0:l_ip.append([result[0],1])except Exception as e :print(e)#print l_ip.count()print 'sorted:'l=SortList(l_ip)for i in l:print i[0]+' '+str(i[1])xml.close()print '............END............'#print bs


阅读全文
0 0
原创粉丝点击