论坛首页 Java企业应用论坛

Tomcat并发性能调优问题

浏览 79390 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-02  
在将数据库连接数调成50之后,系统已经稳定运行了3个工作日,两个休息日,经受住了6次高峰压力。希望在下一个工作周,在更长的时间里系统都能继续保持稳定。阿弥陀佛!

谢谢各位帮忙!

不过在前几天我在公司做压力测试的时候,有一个很奇怪的现象。我测试的时候将数据库连接数设成20,在加压要40个并发请求时,从SQLSERVER里查到当前的连接数竟然有30几个。测试的数据库服务器是单颗双核至强2.4,那个时候数据库服务器CPU已经在80%-100%之间波动,而且还会周期性的回落到0%,然后又回升上来。页面的响应时间在4-5秒左右。
再继续加压到60个并发请求,数据库里查到的连接数在48,42,35等数量上频繁波动,每秒查到的数据都不一样,而且都超过了设置里的20个上限。很奇怪。当压力卸载之后,数据库连接数就迅速回落到设置里的最大空闲连接数10个。

谁能解释一下这个数据库连接数的现象?
0 请登录后投票
   发表时间:2008-05-02  
不少朋友都建议我使用多TOMCAT实例集群。以生产环境的机器配置,单TOMCAT实例的确不能充分发挥硬件的性能,主要是4G内存不能充分利用。跑两个实例可能 解决某些类型的压力负载的问题。

但是我个人认为,现在的现象不太象是TOMCAT本身的并发性能问题。另外,这个应用除了主表,其他的很多表都做了缓存来减少读数据库的次数。如果要做多实例机群,就要解决缓存同步问题,这给开发和部署都增添许多的麻烦。

单个TOMCAT实例,肯定是不能充分利用4G内存的了。但是目前45个并发的时候,才使用了200M的JVM内存,那么即使有100个并发,内存消耗肯定也不可能超过1G,所以内存不是单实例造成的瓶颈。

对于4颗双核CPU,单个TOMCAT实例是否能够管理好调度好自己的线程,充分发挥出这8个核的性能是关键。我估计这对TOMCAT应该不是问题。

之后就是数据库操作的影响。这种情况一般不能通过多实例解决问题吧。除非是象我这次这样,连接数配置不当,20个太小了。如果两个TOMCAT,实际就是40个连接。那么这实际就是绕个大弯使用麻烦的不合适的办法解决问题了。
更常见的情况是过于频繁的无必要的数据库操作,导致性能瓶颈。
0 请登录后投票
   发表时间:2008-05-02  
mobilefeather 写道


单个TOMCAT实例,肯定是不能充分利用4G内存的了。但是目前45个并发的时候,才使用了200M的JVM内存,那么即使有100个并发,内存消耗肯定也不可能超过1G,所以内存不是单实例造成的瓶颈。

对于4颗双核CPU,单个TOMCAT实例是否能够管理好调度好自己的线程,充分发挥出这8个核的性能是关键。我估计这对TOMCAT应该不是问题。

冒昧问一下,你的TOMCAT内存是怎样设置的?
曾经在某工程中,将tomcat内存调到512-1024M,刚刚特意察看了下,现在不是特别忙的情况下TOMCAT的内存占用在790M左右,在高峰期一般在900M-1G。在GC进行回收时,TOMCAT的内存会下降到100-200M左右,但机器的整体内存占用不会下降。
该并发连接数一般在70-120,由于将常用数据放置到了cache中,每隔十分钟进行刷新,所以对数据库压力不是很大。
另外,这个工程,我们采用的也是IIS+TOMCAT,使用ajp。刚刚lz说的503错误,我们也遇到过,在TOMCAT连接不上数据库的时候,前端页面会出现503。
0 请登录后投票
   发表时间:2008-05-03  
mobilefeather 写道
那个时候数据库服务器CPU已经在80%-100%之间波动

觉得降低数据库负荷是关键,其它无关紧要:)

0 请登录后投票
   发表时间:2008-05-03  
这个问题不是应用服务器的问题,而是一个业务问题和业务处理方法的问题。

可以试一下采用lucene.
0 请登录后投票
   发表时间:2008-05-04  
masterkey 写道
这个问题不是应用服务器的问题,而是一个业务问题和业务处理方法的问题。

可以试一下采用lucene.


在我的印象中,lucene主要是用于检索的吧,在这里是否合适啊?另一方面,我这里的记录插入,是由另一个用C写的后台服务做的,这样对lucene的索引更新会比较麻烦。而且在高峰期插入记录速度会比较高,每秒有10条以上,不知道lucene能否承受这样高的索引更新压力。
0 请登录后投票
   发表时间:2008-05-05  
连接池20小了点,100个吧。
然后检查下是否有长事务导致锁表。
建议最好可以监测下每个sql的执行时间。
0 请登录后投票
   发表时间:2008-05-05  
你们说的并发是什么概念? 一个时间段内的请求数?同一时间内 tomcat 线程使用数?如果是一个时间段内的请求数时间周期是秒级的还是毫秒的 如果是毫秒的话太夸张了
0 请登录后投票
   发表时间:2008-05-05  
nihongye 写道
mobilefeather 写道
那个时候数据库服务器CPU已经在80%-100%之间波动

觉得降低数据库负荷是关键,其它无关紧要:)


同意!
lz的情形目前每遇到过,不过有差不多类似的大数据量
当前公司的系统存在4大系统连接到一个数据库上,某些地方使用sybase,其他使用oracle 至少v9,没有用过sql2XXX
数据量非常大,按照月表存储,存在5类数据存为月表,每个月表数据至少300W
其中web系统一般架构在tomcat 5.0,少量在weblogic v8或以上,
目前觉得楼主应该
1 采用连接池
2 数据库能够给web提供多少连接就设置web最大连接为那个数值,当前看你们的系统并发访问>>>当前设置的连接20,觉得有问题
3 数据库服务器cpu 80%~100%之间绝对有问题,我们公司同时存在4大系统访问同一个数据库,数据库服务器,只有在一个特定的时刻才会出现高占用率,而且非常平稳,我们客户的机器环境和你的相当,除开采集和后台计算有动作时cpu会飙升,一般web动作时,基本上cpu比较平稳的,不会长时间在高水平,一般<90%,稳定时在25%左右
4 tomcat设置有问题,看你所说内存占用仅仅200M有问题,记得前面有人说jvm配置512M~1.4G,一般jvm占用在800左右,这个比较正常,当前我们的系统都是使用768M~1.4G,其实很多时候是接近1.3G,无法设置到1.4G,我们的应用一般空闲时都会达到950M的样子,其中档案作了数据缓存大概要消耗150M左右内存
建议JVM有多少设置多少吧,我觉得你们的应用设置384M~768M应该够了,过大JVM gc回收时太耗时。
如果JVM经常消耗cpu非常高〉90%而且jvm内存占用接近设置的最大值,非常有可能就是存在内存泄露,或者程序存在非常巨大的内存请求导致的(4月初,一个现场出现web经常cpu〉90%,tomcat假死,解决原因:缓存方案不合理,导致频繁请求大内存进行数据缓存,优化缓存方案后解决)
5 利用数据库的监测工具检测耗时的操作,和当前的锁情况或连接情况
0 请登录后投票
   发表时间:2008-05-06  
一个简单的方法,把sql到sqlplus里执行一下,看看用时,其实20个连接,你的sql运行快的话,40并发是没问题的,如果你的sql执行慢的话,别说20,100也是不行的.

我刚刚遇到这个问题,还发了贴,他们说用缓存,但我还是把执行慢的sql用了存储过程,你可以试试
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics