关于session leak的问题分析

在生产环境中,作为dba需要对系统的负载有一个很清晰的认识。能够在很快的时间内能够发现系统潜在的问题,并且及时定位问题,高效的响应和处理问题。
比如说对于生产环境的session leak问题,这个部分是awr都很难捕捉到的信息,如果问题比较隐蔽,连ash也很难定位。
比如说在早上9点的时候某个程序出现了session leak的问题,有些程序的处理不能及时的关闭连接,到时连接数急剧增加,但是因为这个过程中,那些连接到数据库session没有再处理数据,就变成了Inactivie了,这部分信息ash也是很难捕捉到的。同时系统的负载会有一定的提升,系统看似很忙,其实没有处理更多的信息。这种情况可以简单理解为session leak的一种体现。
这个时候我的建议是能够通过一套完善的监控体系来作为oracle工具集的补充,毕竟很多类型的问题,oracle不会都解决完。有些甚至可以自己去写一些脚本之类的来完成。
对session的监控就显得很有意义,我说的session监控,不只是包括active的session,而且包括inactive的session.
比如如下的图表,通过监控工具可以看到在这个下午的时间内,active session都在50个以内,从这些数据来看,判断不出系统到底有没有问题。

如果我们现在假设系统的session数目前最大支持5000~6000,那么就可以设定一个阀值,超过某一个阀值,就是警戒线,就可以说明session存在一定的问题,需要检查,如果再设定一个阀值,超过了这个阀值,就需要立刻做出响应。
对于5000个session的库来说,目前我设定的阀值就是3000~35000,如果session在这个范围内,就需要引起重视,排查到底是什么原因导致的,设定的第二个阀值是4000,如果超过这个范围,问题就很紧急了,需要马上做出响应。尽快的定位问题,及时处理。

回到上面的那个图表,从图表上来说,active session在50个以内,完全不是什么问题。但是我通过一定的脚本得到下面这个列表就会发现这个问题是多么的严重。

STATUS         
CNT

-------- ----------

ACTIVE          
58

INACTIVE       4889

         ----------

sum           
4947

一共5000的session,现在达到了4900多,已经没有多少富余的session了。需要马上定位问题。
首先是需要定位session占用过多的program部分是哪些。通过如下的排查马上可以发现jdbc客户端中占用了过多的session。

PROGRAM                                   
CNT STATUS

----------------------------------- ---------- --------

JDBC Thin
Client                         
4338 INACTIVE

extract@xxxxxxx(TNS
V1-V3)               
60 INACTIVE

java_q4p@xxxxxxxx(TNS
V1-V3)              
40 INACTIVE

java@xxxxxxxx(TNS
V1-V3)                  
31 INACTIVE

java_q4p@xxxxxxxx(TNS
V1-V3)              
31 INACTIVE

.......

定位了program的部分,就开始定位machine,username。更多的监控信息可以参考
通过shell脚本监控oracle session 
http://blog.itpub.net/23718752/viewspace-776143/
马上能够定位到session是从某台服务器上连过来的,这个时候就需要马上定位这台服务器上运行的程序。
可以通过随机抓取一部分session的信息,然后通过sid来查看目前inactive 状态的session之前运行的sql语句来排查。
select sql_id prev_sql_id ,sql_text from v\$sql where sql_id in (select prev_sql_id sql_id from v$session where  (sid||','||serial#)='$1'  ) and rownum
通过这些步骤肯定能够得到一些有用的信息。
今天的这个案例中,我发现很多inactive的session都是连续的,我就随机抓取了2个session,然后从查看执行过的sql记录,发现都是同一个insert语句。这样可以提供这些信息给相应的开发和系统部分来马上处理。
经过排查,他们发现确实是一个session leak的问题,经过讨论,启用了2个job在处理,占用了过多的资源,但是这两个job的优先级不是很高,所以可以稍后处理,就这样把这两个job先停掉,session的占用率马上就降下来了。
通过这个问题的排查是想说明不要完全依赖某个工具,要有自己的思路来处理问题,设定session的管理阀值就是一个衡量系统健康的指标。

时间: 2024-09-24 23:23:36

关于session leak的问题分析的相关文章

使用awr来分析session leak问题

awr是生产环境中排查问题的利器,但是有一些问题是awr定位不了的.不如session leak的问题,因为v$session中的数据是实时改变的,一来awr生成快照的频率也有限,二来如果session leak的问题发生,但是系统资源消耗不高,awr也不一定能够马上定位出问题所在. 对于session leak的问题,当发生问题的时候,等我们连到系统中的时候,可能问题又消失了.大体来说系统中的session变化基本都是有一定的变化规律的,在业务高峰期中,session会保持在哪个幅度,系统空闲

nginx中session ticket重用Session提高https性能分析

原创文章:来自nginx中session ticket重用Session提高https性能分析 https会话建立初次使用session ticket的SSL握手流程如下: Client Server ClientHello (empty SessionTicket extension)--------> ServerHello (empty SessionTicket extension) Certificate* ServerKeyExchange* CertificateRequest*

数据分析方法论:你真的懂 Session(会话) 分析吗?

在数据分析领域,Session是一种专业的数据分析.对于有数据驱动意识的互联网人来说,这并不陌生--Session 即会话,是指在指定的时间段内在网站上发生的一系列互动.例如,一次会话可以包含多个网页或屏幕浏览.事件.社交互动和电子商务交易. Session:解决用户分析中的"线"型难题 Session 分析有何意义? 人们往往最熟悉事件分析模型,且用户行为事件往往以"点"的方式呈现,即某人在什么时间什么地点干了一件什么样的事,也就是我们熟知的 4W1H 模型:Wh

关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析_php实例

最近由于项目开发需要,手机客户端和网页端统一使用一套接口,为保证 会话(Session) 能够正常且在各类情况下兼容,我希望能够改变 SessionID 的获取方式.默认情况下,所有网站都是通过 HTTP 请求的 Header 头部中的 Cookie 实现的,通过 Cookie 中指定的 SessionID 来关联到服务端对应数据,从而实现会话功能. 但对于手机客户端,可能并不会支持原始的 Cookie,亦或者根据平台需要而屏蔽,因此开发中要求通过增加一个请求头 X-Session-Token

PHP中cookie和session的区别实例分析_php实例

cookie和session是PHP程序设计中非常重要的技巧.深入理解并掌握cookie和session的应用是进行PHP程序设计的基础.本文就以实例形式来分析一下二者之间的区别.具体分析如下: 1.Cookiecookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制. PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似.  1.1 设置cookie:    可以用 set

ASP.NET Session的实现原理分析

用户向服务器提交请求时,服务器都会给每个用户分配一个SessionId,保存在用户浏览器的Cookies中,SessionId是全局的,也就是说只要Cookies还存在,服务器就会认为这是同一个用户,从而实现了每个用户都有自己独立的全局Session域.当用户再去请求的时候,在http头把这个SessionID的Cookie发到服务器端,服务器就去找这个SessionID,如果找到了.就证明这个用户的状态是存在的. 我们可以通过以下实验更清除的了解Session: 点击按钮后页面回传,但是输出的

CI框架Session.php源码分析_php实例

CI的Session并不是原生的session,正是我前面所有的cookie based session,另外,CI可以根据用户选择配置是否将session存入数据库中,本人很喜欢这个功能,还有就是"闪出数据"的功能,既闪出数据只是对下次服务器请求可以,之后就会被自动清除.常见使用方法有: $this->session->set_userdata('some_name', 'some_value'); //设置session数据 $this->session->

jsp编程中session的用法实例分析_JSP编程

本文实例讲述了jsp编程中session的用法.分享给大家供大家参考,具体如下: TTP协议是无状态的,即信息无法通过HTTP协议本身进传递.为了跟踪用户的操作状态,ASP应用SESSION对象.JSP使用一个叫HttpSession的对象实现同样的功能.HTTPSession 是一个建立在cookies 和URL-rewriting上的高质量的界面.Session的信息保存在服务器端,Session的id保存在客户机的cookie中.事实上,在许多服务器上,如果浏览器支持的话它们就使用cook

thinkphp3.x中session方法的用法分析_php实例

本文实例讲述了thinkphp3.x中session方法的用法.分享给大家供大家参考,具体如下: 一.Session方法用于Session 设置.获取.删除和管理操作. Session 用于Session 设置.获取.删除和管理操作 用法 session($name, $value='') 参数 name(必须):如果传入数组 则表示进行session初始化,如果传入null表示清空当前session,如果是字符串则表示session赋值.获取或者操作. Value(可选):要设置的sessio