背景:
通过观察数据库指标监控平台,发现数据库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 BeautifulSoup
import re
def SortList(l1):
max_value=0
position=0
new_l1=[]
while (True):
if len(l1)==0:
break
if len(l1)==1:
position=0
new_l1.append(l1[position])
l1.pop(position)
break
max_value=l1[0][1]
for j in range(len(l1)):
if l1[j][1]>=max_value:
max_value=l1[j][1]
position=j
try:
new_l1.append(l1[position])
l1.pop(position)
except:
print 'error',position,l1[position-1]
print len(l1)
return new_l1
if __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 contents
print "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=0
result=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]+1
found=1
break
if 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