Mysql Tomcat C3p0系统性能调优个人总结(赞!)

来源:互联网 发布:qq音速网络连接 编辑:程序博客网 时间:2024/05/22 14:45

应用逻辑 就是用c3p0 到数据库查询数据并http返回Json数据

 

1 调优前的最初的测试结果   JMeter test result

No.

Type

Original

1000 data bigger

1

500Connection

250 query/S

63q/S
70q/S

2

1000 connections

255q/S

57q/S

65 q/S

这个数据是从程序的log 中打印出的 数据库select语句 中得出的结果(正确与否后面会有讨论)。

2 经过IOD系统打印 SQL query 的执行时间 和 tomcat 每个request 的 响应时间,找出 系统瓶颈 是因为一个 select语句 使用了 in:

 SELECT* FROM infoobject_table where category = 'advertisement' and deleteflag=falseand (id in (select info_object_fk from timespan_table where vod_id = ? and deleteflag=false))Order By Rand() Limit

在 原来的小数据库中  数据较少 查询 时间 100ms 左右

在 1000个 video 的数据库中 查询的时间 达到 超过 1S  

先注释掉 这个语句 ,想办法用优化的办法实现这个功能。

 

注释掉 这个 select 语句后得到的测试数据(还是计算从程序的log中打印出的 数据库select语句)Jmeter testresult

No.

Type

Original

1000 bigger

1

500Connection

250 query/S

CPU 100%
150q/S

2

1000 connections

255q/S

160q/S

160q/S

现在 的问题 是碰到 tomcat  request 160q/S  再怎么调优 增加不了了,tomcat的内存  配置了4G  实际使用了不到 1个G ,CPU 8核心  利用率 只有10%。

 

3  发现前面的统计系统响应 性能有问题,很多时候sql 语句打印出来了,但是并没有执行完成, 因为c3p0 连接数只有15个,都在等待数据库连接,后来改变统计方式。

还有就是打印出 c3p0 的连接池的工作状态

[java] view plain copy
  1. private void printDataConnections() {  
  2.         ComboPooledDataSource ds = (ComboPooledDataSource) DBConn.getDataSource();  
  3.         StringBuffer connectionBuffer = new StringBuffer();  
  4.         try {  
  5.             connectionBuffer.append("getMaxPoolSize=" + ds.getMaxPoolSize());// 最大连接数  
  6.             connectionBuffer.append("getMinPoolSize=" + ds.getMinPoolSize());// 最小连接数  
  7.             connectionBuffer.append("getNumBusyConnections=" + ds.getNumBusyConnections());// // 正在使用连接数  
  8.             connectionBuffer.append("getNumIdleConnections=" + ds.getNumIdleConnections());// 空闲连接数  
  9.             connectionBuffer.append("getNumConnections=" + ds.getNumConnections());//总连接数  
  10.             logger.info("  connectionBuffer=" + connectionBuffer.toString());   
  11.         } catch (SQLException e) {  
  12.             // TODO Auto-generated catch block  
  13.             e.printStackTrace();  
  14.         }  
  15.   
  16.   
  17.     }  


后来进行MySQL(默认100最大链接), tomcat(连接数default)tomcat 内存配置, c3p0(最大15个链接) 链接池优化。

Mysql: 在win7  c:/programdata/mysql/mysql server5.6/my.ini中配置

                        max_connections=1000


 mysql> show variables like 'max_connections'; 
  +-----------------+-------+ 
  | Variable_name | Value | 
  +-----------------+-------+ 
  | max_connections |1000 | 
  +-----------------+-------+  


Tomcat: 配置连接数

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <Connector port="8080"protocol="HTTP/1.1"         
  2.                                   minSpareThreads="25"  
  3.                                   maxSpareThreads="75"  
  4.          enableLookups="false"  
  5.                                   disableUploadTimeout="true"  
  6.                                   connectionTimeout="20000"  
  7.          acceptCount="200"   
  8.                                   maxThreads="800"  
  9.                                   minThreads="600"  
  10.                                   maxProcessors="1000"  
  11.                                   minProcessors="1000"  
  12.          useURIValidationHack="false"  
  13.       
  14.               redirectPort="8443"  
  15. />  


             配置 tomcat 运行jvm 配置

               set JAVA_OPTS=-server -Xms4400M-Xmx4400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M-XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection-XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly-Djava.awt.headless=true

          

应用  c3p0 连接池配置:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <bean id="dataSource"   
  2.        class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close">   
  3.         <propertynamepropertyname="driverClass" value="com.mysql.jdbc.Driver" />   
  4.         <property name="jdbcUrl"value="jdbc:mysql://192.168.4.112:3306/iod1000?useUnicode=true&characterEncoding=utf-8"/>   
  5.       <propertynamepropertyname="checkoutTimeout" value="60000"/>  
  6.      <propertynamepropertyname="idleConnectionTestPeriod" value="30"/>  
  7.      <propertynamepropertyname="initialPoolSize" value="50"/>  
  8.      <property name="maxPoolSize"value="800"/>  
  9.      <property name="minPoolSize"value="50"/>  
  10.      <propertynamepropertyname="maxStatements" value="100"/>  
  11.     <propertynamepropertyname="properties">   
  12.         <props>            
  13.             <propkeypropkey="preferredTestQuery">SELECT 1</prop>     
  14.             <propkeypropkey="c3p0.maxIdleTime">25000</prop>     
  15.             <propkeypropkey="c3p0.testConnectionOnCheckout">true</prop>   
  16.             <propkeypropkey="user">root</prop>     
  17.             <prop key="password">iptv4Um8</prop>   
  18.         </props>   
  19.       </property>   
  20. </bean>  


查询配置了mysql 最大连接数 1000, 配置 c3p0 连接池 800  配置 tomcat 链接 800 测试结果:

             CPU 8Core  12% usage

             Memmory900M/2.4G                           120q/S 

这个时候碰到的问题就是 cpu 和 内存 都没有达到上限,但是查询的 性能却提升不上去了。

 

5  试用jconsole 查看tomcat   中的 线程状态,好多线程都是  blocked on Java.util.logging.console 原来是线程一直在等待写日志被block住了。

把写log的语句 全部注释掉。OK  系统终于飞起来了。

现在 能达到      250q/S。

 

需要检查的地方:

CPU 

内存

mysql最大连接数

tomcat 连接数配置

tomcat JVM 配置 重要的是内存大小

数据库连接池配置:

程序内部的瓶颈。

0 0
原创粉丝点击