分析诊断数据库连接池问题

top -H -p pid可以查看cpu的负载,cpu的等待或阻塞状态

jmap -histo 2224 >20150411.txt,最终定位到是哪个方法导致的内存泄漏

慢慢的cpu负载就会降下来,线程就会断了

yum install -y dstat

dstat -c:显示cpu情况

dstat -m:显示内存情况

dstat -d:显示负载情况

dstat -l:显示负载情况

dstat -n:显示网络情况

xxxxx 网站一直转圈

第一种情况是:负载机本身是否有瓶颈

第二种情况是:网络是否有瓶颈

第三种情况是:到应用服务器,验证应用服务器是否有cpu排队的问题

如果压力过大的话,cpu负载很高的话,就是说load average很高的话,会有大量队列在cpu这块获取不到时间片,也会排队

第四种情况是:怀疑到内存

物理内存没有关系,因为是java项目

怀疑到jvm内存这里有频繁的full gc产生,full gc的时候会暂停整个应用程序的线程,看一下full gc,jvm默认配置如下图:

老年代默认是4M,最大持久代默认是64M

用jstat-gcutil 2633 3000 5命令去看一下,发现有大量的full gc,持久代一直在99%以上

于是把tomcat(本虚机是tomcat1)下bin目录下的catalina.sh里的jvm参数里的老年代和最大持久代的参数改大,full gc会发生在老年代和持久代,具体改多大,参考下面的配置,去掉注释#

#JAVA_OPTS="$JAVA_OPTS  -Xms800m -Xmx800m -Xmn400m -Xss1024K-XX:PermSize=128m -XX:MaxPermSize=128"

保存并重启tomcat,然后再用jmap -heap 2633命令去看老年代和持久代的used,都在20%以下,再用jstat -gcutil 2633 3000 5命令查看full gc的次数为2次了,刷网页也不打转了

第五种情况是:看中间件线程池这里是否有排队,如果有排队的话,需要改下线程池的配置,在此进行压测,再进行验证,直至确定是否是线程池的问题

第六种情况是:到数据库连接池这里,看是否有排队,怎么看?

网页打转,不是超时就是排队,在loadrunner场景的错误日志里看到120s time out,应该不确定是超时导致的,第二种可能是排队,那么排队的地方只有三大块

一是在cpu这里排队:

cpu的时间片是以几万分之一的那种毫秒速度进行切换,可以排除cpu这排队问题,也可以通过命令查看cpu

在Cpu(s)里看到us和sy的值有点高,这两个高只能说明cpu处理的性能不高或者负载大有间隔排队的现象,load average最后15分钟的负载也很正常, wa为0,说明没有排队,也可以通过下面的命令看cpu没有等待现象

二是在中间件线程池这排队:

配置下中间件线程池的监控,观察有没有排队,如果没有,则排除掉这种情况(本项目中证明这里没有问题)

最后一种情况是在数据库连接池这排队:

在数据库客户端输入show processlist,数下自己的IP连接过去的数据库的连接数,发现是30个(在压测的过程中去掉红框里三个不是自己的IP,剩下的就是自己IP的连接数,33-3=30)

发现在jdbc.properties没有配置数据库属相,在

/usr/local/tomcat1/webapps/xxxx/WEB-INF/applicationContext.xml里配置,找到maxPoolSize

将30改为60,重启tomcat,再重新压一下,看看最大连接数是不是就变成60了,发现数据库最大连接数变为60,说明是程序造成的数据库连接池不释放,如下图:

应用程序链接库正常是:

a.建立数据库连接

b.执行sql语句,返回结果

c.关闭数据库连接

如果应用程序没有关闭数据库连接,最后一步就不执行,这样数据库连接就会累积的越来越多,直到达到最大连接数,然后就无法建立新的连接了,页面就卡住了,加载不出来了

从上看出增加连接池后,数据库show processlist,增加了60后再次出现问题,这个时候我们可以确定是数据库的链接池使用后没有释放导致的。

时间: 2024-10-29 19:12:12

分析诊断数据库连接池问题的相关文章

spark 大型项目实战(七):用户访问session分析(七) --数据库连接池原理

**文章地址:http://www.haha174.top/article/details/257789** 1.谈谈数据库连接池的原理 ------------- 这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. 一.早期我们怎么进行数据库操作 1.原理:一般来说,java应用程序访问数据库的过程是: ①装载数据库驱动程序: ②通过jdbc建立数据库连接: ③访问数据库,执行sql语句: ④断开数据库连接. 2.代码 Public

c#与oracle数据库连接池

c#与oracle数据库连接池 在做一个项目,中间要使用webservice和oracle数据库.我在服务端做了用户身份认证,也就是使用session传递用户的登陆信息.在测试时,当用户少的时候,没有问题,但是当大量用户同时访问时,就报错,起初以为是自己的oracle连接部分有问题,几经确认,终于发现了是连接池的问题. 以下是从别人的博客中摘抄的,不敢造次,收录如下: "连接根据连接字符串以及用户标识来建立池连接.因此,如果使用网站上的基本身份验证或 Windows 身份验证以及集成的安全登录,

数据库连接池分析

参考文献 1.一个效果非常不错的JAVA数据库连接池 2.使用 JAVA 中的动态代理实现数据库连接池 3.MySql与oracle的JDBC测试程序 分析 参考文献1是一个用java实现的数据库连接池,可以参考其代码实现,最好也看看java源代码是怎么实现数据库连接池的,两者进行比较. 参考文献2中提到了动态代理,之前写过的一片博客:设计模式之代理模式之二(Proxy)中也讲到了动态代理,这里可以参考一下. 下面首先给出参考1中的代码示例,具体见ConnectionPool.java,修改了部

DBCP数据库连接池原理分析

在比较大的项目中,需要不断的从数据库中获取数据,Java中则使用JDBC连接数据库,但是获取数据库的连接可是相当耗时的操作,每次连接数据库都获得 .销毁数据库连接,将是很大的一个开销.为了解决这种开销,则使用了对象池的技术.程序启动时,先创建一定数量的数据库连接对象,然后只要一用到就直接从对象池中取出连接对象,然后使用完成后不对其销毁,而是再返回到对象池中,这样使连接池对象能反复使用,虽然增加了启动时所需要的时间但是提高了响应速度,对象池也相当于是一个缓存. 这里有DBCP的一些配置参数,通过这

几种常见数据库连接池的使用比较

感觉在介绍之前有必要阐述一下连接池的几个概念,有助于后边一些文字的理解. 最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源.由于频繁的打开和关闭连接对jvm包括数据库都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题.由此使用连接池的作用就显现出来,他的原理其实不复杂:先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是准备给下一个调用者进行分配.由此可以看出连接池节省了大量的数据库

数据库连接池配置说明

1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问题提出来的. 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏.这项技术能明显提高对数据库操作的性能. 1.2 参考资料 DBC

Mybatis深入之数据库连接池原理

Mybatis深入之数据库连接池原理 简介 主要记录Mybatis数据库连接池实现原理.如何使用连接池来管理数据库连接的.连接池如何向外提供数据库连接.当外部调用使用完成之后是如何将数据库连接放回数据库连接池的. 准备 有前面的相关文章的铺垫.这里就不再从Mybatis数据库相关信息的初始化以及何时创建一个真正的数据库连接并且向外提供使用的.这两方面的过程可以参见Mybatis深入之DataSource实例化过程和Mybatis深入之获取数据库连接两篇文章. 了解Mybatis数据库连接池如何配

01_数据库连接池,数据源,ResultSetMetaData,jdbc优化

 一.数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接. 这样的方式会导致用户每次请求都要向数据库建立链接而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.宕机. 解决方案就是数据库连接池 连接池就是数据库连接对象的一个缓冲池 我们可以先创建10个数

Druid数据库连接池使用

阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好 可以监控连接以及执行的SQL的情况. 加入项目的具体步骤: 1.导入jar <parent> <groupId>com.alibaba</groupId> <artifactId>parent-pom</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> 2