系统信息
利用逻辑 就是用c3p0 到数据库查询数据并http返回Json数据
1 调优前的最初的测试结果 JMeter test result
No. |
Type |
Original |
1000 data bigger |
1 |
500Connection |
250 query/S |
63q/S |
2 |
1000 connections |
255q/S |
57q/S 65 q/S |
这个数据是从程序的log 中打印出的 数据库select语句 中得出的结果(正确与否后面会有讨论)。
2 经过IOD系统打印 SQL query 的履行时间 和 tomcat 每一个request 的 响应时间,找出 系统瓶颈 是由于1个 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% |
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 的连接池的工作状态
后来进行mysql(默许100最大链接), tomcat(连接数default)tomcat 内存配置, c3p0(最大15个链接) 链接池优化。
Mysql: 在system/programdata/mysql/my.ini中配置
max_connections=1000
Tomcat: 配置连接数
配置 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 连接池配置:
查询配置了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 原来是线程1直在等待写日志被block住了。
把写log的语句 全部注释掉。OK 系统终究飞起来了。
现在 能到达 250q/S。
需要检查的地方:
CPU
内存
mysql最大连接数
tomcat 连接数配置
tomcat JVM 配置 重要的是内存大小
数据库连接池配置:
程序内部的瓶颈。