大蟒蛇肚子的"风暴"
Posted Nolan_Chan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大蟒蛇肚子的"风暴"相关的知识,希望对你有一定的参考价值。
遇到了数据库连接数不足的问题,一般情况下会预留一些会话增加的情况,但在一些特殊情况下如连接风暴(logon storm), 如果在监听中没有做rate限流,对数据库来说巨大的冲击可能会导致数据库Hang 或 ora-20 或ora-18 错误。 对于Hang并伴有进程数不足的情况,AWR、ASH 都可能无法升成,甚至数据库都无法登录或做SSD 都不成功, 这时候LISTENER.LOG 就成了关键的“破案”线索。
以往往往会用一些shell命令进行分析,如:
$ fgrep "establish" anbob_listener.log |awk \'{print $1 " " $2}\' |awk -F: \'{print $1 ":" $2 ":" $3 }\' |sort |uniq -c
分析时需要用肉眼查看结果,有些时候还会碰到一些状况,监听日志已经拷贝到windows下,还得传输至虚拟机下才能进行分析。
这时候往往就会想有工具可以跨平台,能自动生成图表就更好了。后来认识到了大蟒蛇,发现它这方面的能力非常。
今天,来分享一下怎么用大蟒蛇去对监听日志进行分析,并生成以下图表:
这是一个二维图,需要有x轴和y轴数据,然后在进行组图。
监听日志有些数据时有效的,有些是无效的
有效数据条目:
"05-AUG-2016 12:02:12 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=bomcdb)(CID=(PROGRAM=perl)(HOST=NMC-PREDEAL1)(USER=nmcuser))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.2.18)(PORT=57862)) * establish * bomcdb * 0"
数据条目:
05-AUG-2016 13:25:06 * ping * 0
在数据处理时,特意把包含以下字符service_update、ping、status的数据过滤掉,进行统计。
if str.__contains__("service_update") or str.__contains__("ping") or str.__contains__("status") == 1:
当获取到的数据都是有效后,我们要对数据进行拆分,继续获取我们想获取的数据,由于只做统计,那么只要日期即可:
x = str.split(\'*\')[0]
发现数据结尾包含一个空间,将空格进行去除
temp = x.strip()
监听日志的数据拆分完毕,把这些数据存放至一个数组 lsn_data中(这里可能大家有点疑惑,为啥不建二维数组呢?python不存在多维数组)。
因为监听日志有一个很特别的地方,数据本来就是有序的,无需排序,只需去重,把数据放到数据lsn_time中,在处理过程中,可以统计时间的个数并放到数组lsn_count中
# 去重
for l_time in lsn_data:
if l_time not in lsn_time:
lsn_time.append(l_time)
lsn_count.append(lsn_data.count(l_time))
数据已经有了,我们只要把数据画图,即可出现上述的图表。
可以把这些数据用图展示,也可以用表展示。这里用图进行展示
s = Series(lsn_count,index=lsn_time)
s1 = Series(16,index=lsn_time)
plt.ylim(0,80)
s.plot()
s1.plot(color=\'red\', linestyle=\'--\')
plt.show()
用series()函数进行画图,lsn_count为纵坐标,index作为横坐标。在这里我加了1条红色的先s1,用虚线展示。在2013年,广东ngboss上线之初,某库经常出现tnsping缓慢问题。后来经美国实验室测试,每秒的连接数达到16个监听连接就会缓慢。若生成的图表长时间超过红色虚线,那就应该对应用进行拆分整理,避免监听风暴的产生。
以上是关于大蟒蛇肚子的"风暴"的主要内容,如果未能解决你的问题,请参考以下文章