近期有一套业务系统数据库总是出现如下告警“严重告警:XXX Oracle 服务器:10.10.X.X 数据库的侦听器 LISTENER 状态为 Inactive ”系统已经过保所以边查资料 边尝试处理一、问题描述 当登陆到数据库检查数据库状态无异常,查看监听也是正常,那么集群资源状态也是正常。查看数据库后台日志时发现了错误 "ORA-00020:maximum number of processes(2000) exceeded" 连接数达到最大值 2000.查看当前数据库最大连接数设置为 2000,查看数据库除后台进程外两节点数均为 1940 多,外加 50 多个已经超出 2000 了。 排查数据库最大连接数和当前连接数
从当前连接以及后台日志查看,INACTIVE 非活跃会话 1940 之多,但数据库 CPU 内存等资源均正常,也没有异常等待事件,不过下午已经出现过连接数过高的问题,根据经验猜测应用系统的中间件连接池以及初始连接大小设置有问题,果不其然后面联系应用方确认没有设置连接超时。 由于此系统不是核心系统,活跃会话也只有三四个更没有大事物,简单查询后便决定先杀掉连接恢复告警,但当时想要通过数据库杀掉非活跃会话连接,可是通过 SID 和 SERIAL# 查杀时很多会话已经不存在了。那么当时采取的办法就是通过操作系统 kill 查杀了,又因为活跃会话很少无事务,便使用如下命令全部查杀了。 注意:生产系统中谨慎操作,尤其是有大事物时不能直接查杀。 ps -ef | grep LOCAL=NO | grep -v grep | awk '{print $2}' | wc -l ps -ef | grep LOCAL=NO | grep -v grep | awk '{print $2}' | xargs kill -9
查杀后连接数下降数据库告警恢复,算是告一段落了,没有深入问题根源。
二、问题复现 第二天早上十点多,还在查看另一系统的性能问题时,有人告知此系统又有问题,无疑又是连接数问题,登陆到系统后查看果不其然。两个节点的连接数已达 1800 多,通过操作系统 kill -9 紧急杀掉会话后数据库连接数下降,但是出现问题时还没达到阈值,肯定还有其他没有来得及的问题存在,这个便要后续排查了。
三、问题排查 发现此数据库内存管理是自动管理的,SGA、PGA 设置的值不合理,当出现大量连接时,PGA 设置不合理,新的会话连接则会出现问题应用方反馈出性能问题;另外大量非活跃会话未释放也没有从数据库端限制,未设置超时连接 SQLNET.EXPIRE_TIME 参数。 Dead Connection Detection(DCD) SQLNET.EXPIRE_TIME: 设置 DCD 检测时间为 1 分钟。指定时间间隔(以分钟为单位),以发送探测以验证客户端/服务端连接处于活动状态。设置一个大于 0 的值可确保不会由于客户端异常终止而无限期地断开连接。 Dead Connection Detection (DCD)与Inactive Sessions .
于是乎则在两个节点中均设置 SQLNET.EXPIRE_TIME=1,这个参数在 RAC 中则需要设置到 Oracle 用户下 $ORACLE_HOME/network/admin/sqlnet.ora 文件中。还有个问题就是不确定这个参数到底是设置到哪个用户下的话,可以Oracle、grid 两个用户都设置了总有一个会生效。
设置完后我这边又通过数据库杀掉了一些连接,通过拼接 SQL 杀掉一个小时前的非活跃会话及非后台进程会话。但是发现数据库中出现 KILLED 会话达 594 个。会话没有得到释放,节点二便采用系统层面的 kill -9 杀掉会话。
后面应用方根据建议设置了中间件 Weblogic 连接池超时为 180s 最小连接数为 1 后,节点一 KILLED 也得到了释放,数据库的连接也下降到 400 左右了,算是一个正常范围值。
内存调整 前面说过内存管理为自动管理,这里需要将其调整为手动管理,由于是生产环境不能够随时重启则需要停机窗口,这里先将需要调整的内存参数以及合理的值列出来。
AIX 操作系统内存 64G,数据库内存 38.25G,将其调整为 30G,PGA 调整为 14G,shared_pool 5G,db_cache 15G,large_pool 1G,java_pool128G,streams_pool 256M。这些值都是一个近似的值,一个较为合理的值,并不保证 100% 完美正确,在 AWR 报告中 Advisory Statistics 部分,也会有相关的建议值,如下便是一个较为合理的 shared_pool 的值。设置完这些值后重启数据库系统,将会有一个很大的提升。利用 Profile 超时设置,这个没有使用过,网上有方法便晚上回来测试一番 。首先查询数据库是否开启 resource limit 限制,如果没有开启,则开启这个参数。
然后使用客户端工具 SQLPlus 远程连接,查询业务数据等待 1 分钟后在继续查询则会报错 ORA-02396。
|