struts2+hibernate3.2+spring2.5+tomcat6.18+proxool9.1+mysql.5.1.37 +win2003
hibernate没有做任何优化,就是默认的让srping2.5来管理事务的.
做了一个注册登录的项目.这个项目是从第三方传用户数据和验证签名过来,我必须要判断用户过来以后,数据没有被修改,并且数据库里没有数据,才可以注册.
因为要用到大压力并发,所以做了很多压力测试,现在和大家分享一下.
在首先,我们并不有马上做数据库访问,注册等方面的压力测试,而是先准备把静态页面压力测试到1000以上.
也就是把Tomcat配置好,让它能处理这么大的并发页面.
具体可以见我下面的文章:
hi.baidu.com/%CD%F5%D7%D36%BA%C5/blog/item/ff0f9724ff375f21d4074237.html
并发压力测试到1000,很快就到了.具体配置在文章里有写到.
接下来,就是做注册登录页面了.具体的流程是这样的.
在第一次是用的proxool数据连接池.
在100的并发的时候,是很勉强的过去了.
We are already in the process of making 6 connections and the number of simultaneous 这个问题出现了.点击链接可以看到解决问题和方法.
提升到200的时候,就出现问题了.压力曲线很难看.
首先是这个问题,每次打开的连接数太小.更改了,还是提升不上去.主要问题卡在数据库.
数据库拿不到更大的连接数,前端页面就卡在数据库这里,全部卡死了.
基本上一个下午的反复配置,实际上都是无用功了.
于是项目组决定,更改连接方式.打断连接的最大问题,数据和前端页面的等待连接.让失败的数据快速返回失败,不要卡死后面的连接数据.不能卡死服务器.
于是在紧张的2天时间里,把ssh框架给引入进来了.让spring管理struts2的actioin类.也让spring解决hibernate的事 务.在配置struts2+hibernate3.2+spring2.5+tomcat6.18+proxool9.1+mysql.5.1.37里, 我吃尽了苦头,深深的理解了,这些框架没有根本了解带来的一些歪路.对于这些配置,我会再开一贴说明.因为网上关于这几个加起来的配置文章,大多是相互抄 的,没有根本的配置起来.或者说配置起来,不可用,老报错等.
改完了以后,做100的测试,基本上速度是相当的快.完全没有到测试的上限.
当然,这里也有很多好笑的.
比如我们当时开通了两台服务器,一台是测试的,一台是运行的.在同一个机房.可是网速好像起不来....
因为注册\登录\到首页的话, 这个首页就是2M的大小.100个并发,那可是200M的下载量.不可忽略网速的问题和硬盘的io问题.
在做100以上的时候,基本上就把js\css\图片给取消了,只做 注册\登录\到静态的首页.这个时间我们的测试服务器上的loadruner出了问题.测试人员说得重装. - -!汗过一个.我们没有那么多时间等.
于是到生产机上安装了loadruner就运行起来.虽然这样会影响真实的测试数据,不过更可以忽略网络一块的因素,来评估程序的稳定性了.
本机上,先挂300测试,很快就出现了
We are already in the process of making 6 connections and the number of simultaneous
这个错误,我开到100的,结果还是报 要101个链接.
再改大的时候,就出现 Communications link failure Last packet sent to the server was 0 ms ago.这个错误了.
网上很多都是说连接地址从localhost改成127.0.0.1就好了,我看了一下我的链接,没有错,没有问题....
也有的说是tomcat等待时间太长 wait_timeout 这个默认是8小时,过了就关闭了.可是我的是tomcat刚打开,没有这个道理的.
再分析,应该不是这问题 .
把mysql的最大链接数开大到600.再把proxool的最大链接数开到了500.还留100给其他的程序. - -!
再测试.....还是没有通过,发现很多错误都是不能打开数据库连接了.通过mysql admin查看,发现数据库的连接数量根本就没有上去.说明,不是数据库链接数问题.
再想想,是不是可能出现连接开始的时候,打开太小了,所以在测试的时候,数据库打开消耗时间.在并发的情况下,还要分内存和cpu去处理tomcat事务,这样响应不过来..于是把proxool的最小连接数开到300 proxool.minimum-connection-count="300" ,把proxool.prototype-count="50" 数据活跃数改到50
再开300的测试.通过,没有问题.
但是,不可能一开始就把数据库连接开到300吧.认真分析一下hibernate的原理.是有数据缓存的.而我每一次都是重启tomcat,再来测试,相 当于把hibernate的数据缓存给清掉了.根本就没有体现出hibernate的优势,在这里反而在注册查询的时候,降低了整个系统的性能.
于是,把proxool最小链接数再下调到100.从100个并发测试.好的,没有问题.
再调试到200并发.错了6个,还可以接受.
再调试到300并发.错了10个,还是可以接受.
再调试到400并发,没有错误.
再调试到500并发,没有错误...
看看数据连接数,也上来了.
问题就是出现在这里.
如果你的网站,一上来,并发量就很大的话,那你一定要把最小链接数和保持数据链接活跃数加大.
保证在瞬时的并发时,你的服务器可以处理过来.
如果你的网站访问量是慢慢起来的话,那这两个的初始值都可以设置小一点.
给出大家数据库的配置. 这个配置是放在 tomcat/conf/context.xml下的.通过jndi来调用的.至于为什么要用tomcat来管理.在关于s2 s2.5 h3.2 里会分析.
<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" factory="org.logicalcobwebs.proxool.ProxoolDataSource" proxool.alias="DBPool" user="root" password="root" delegateProperties="foo=bar" proxool.jndi-name="mysqljndi" proxool.driver-url="jdbc:mysql://127.0.0.1:3306/webgame?characterEncoding=utf-8" proxool.driver-class="com.mysql.jdbc.Driver" proxool.house-keeping-sleep-time="40000" proxool.house-keeping-test-sql="SELECT ''" proxool.maximum-connection-count="500" proxool.minimum-connection-count="100" proxool.maximum-connection-lifetime="18000000" proxool.simultaneous-build-throttle="100" proxool.recently-started-threshold="40000" proxool.overload-without-refusal-lifetime="50000" proxool.maximum-active-time="60000" proxool.verbose="true" proxool.trace="true" proxool.fatal-sql-exception="Fatal error" proxool.prototype-count="50" proxool.statistics-log-level="DEBUG" />
大家有什么建议的,欢迎拍砖.