1、问题描述
最近一段时间每天16点左右,数据库服务器中的一个节点(landingbj.com)上CPU利用率突然变为100%,其中90%以上的CPU是系统进程使用的,而且很难下降。服务器上客户端连接的进程数激增。后来从系统工程师监控的结果来看,服务器的虚拟内存有满的情况发生,数据库的内存使用情况没有异常。
2、问题分析
系统工程师分析结果为:当CPU使用100%的时候,操作系统主要把CPU耗费在切换数据库进程上,而且切换的数据库进程一直处于空闲状态,并没有做实际的工作。
从数据库服务器端监控结果来看,每个数据库服务器上,客户端连接的进程数一般稳定在1200个左右,当出现问题时候,客户端连接的进程数最大会增加到2000,但是真正连接上数据库的并不多,没有超过设置的最大值(800),激增的连接中,绝大部分都是两层结构的应用中的连接。
应用程序中,三层结构中的数据库连接数有最大值,两层结构应用中数据库的连接数是没有限制的,当业务请求比较慢的时候,操作人员可能会不停的刷新请求,这样能造成大量的数据库连接。Database link的连接,是通过数据库中表的触发器使用的,创建database link的时候,并没有指定为shared,导致很多database link的连接为inactive状态。
3、解决方法
- 增大出问题接点数据库的内存,增加虚拟内存。
- 把dblink 的连接,由原来的连接到集群数据库调整到连接到单点数据库,以避免DFS lock handle等待时间过大。
- 两层结构的应用程序,调整数据库连接部分的代码。当连接数据库的数目增大到一个值后,不在对数据库请求新连接(没有执行)。
- 两层结构的应用,数据库连接由原来指向集群,修改为指向不出问题的接点(landingbj.com),以减轻出问题数据库的压力。
- 根据awr报表中的信息,修改消耗CPU资源比较大的SQL。