论坛首页 Java版 Tomcat

Tomcat并发性能调优问题

浏览 17007 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-04-27
robbin 写道
出现503错误是说明你的Apache HTTPD Server无法正确连接到后端的Tomcat,超时以后报错为503。这很可能是因为你的Apache转发请求给Tomcat的配置有问题。其实Tomcat现在性能已经相当好了,建议你去掉Apache,直接使用Tomcat,打开APR支持,这样已经足够好了。

你出现这个问题和数据库连接池没有关系。不过你可以考虑把数据库连接池的最大值开到50个,以应付峰值请求。另外不同的连接池还是有很明显的性能差异的,对高并发情况下的数据库访问性能有很大的影响。


有几点需要补充的。
系统前端的WEB服务器是IIS。出现的503错误,也是IIS返回的。在IIS返回503错误的时候,如果直接绕过IIS直接访问TOMCAT,会长时间没有返回。
在系统上线初期,曾经经常出现IIS和TOMCAT同时死掉的现象,后来把IIS转发的缓冲调大到32K就没再出现了。

因为用户需要实现集成WINDOWS身份验证,而且要在已经登录了域的客户端,使用IE访问系统可以自动登录,不需用户手工填写用户名密码登录。(IE可以自动通过Kerberos协议或NTLM协议把操作系统的登录信息发送给WEB服务器)。因此前端使用了IIS做这个集成身份验证的工作。再通过AJP把请求转给TOMCAT。

之前我们曾经尝试使用jcifs在JAVA直接实现集成WINDOWS身份验证,前端不使用IIS而直接用TOMCAT。但是jcifs的表现很不稳定,经常出现连续多次验证失败的现象。无奈之下才在前面重新加个IIS做身份验证。
   
0 请登录后投票
时间:2008-04-28
这样的话会不会是由于IIS转发请求给TOMCAT过程中出现了兼容问题
转个这个给你看看是否有帮助

引用
IIS 503问题排查思路

对于IIS报503的问题相信大家都很熟悉了,博客园以前也经常503,但这个问题不好排查,前几天我也为503问题烦恼,总结了一些排查思路和大家分享,但最终还没有解决问题,请大家有懂的也赶紧指点指点。



网上有人发贴说可能与应用程序池的进程回收设置有关,建议把应用程序池的回收属性页的所有回收选项都禁用,理由是如果没有发现内存泄漏,线程刮起等现象的话应该就不需要设置进程回收。

现在不确定503错误到底是不是和进程回收有关系,如果禁用进程回收设置会不会缓解这个问题,会不会引起更严重的错误。这里的回收应该不是像CLR 的GC那样的内存回收吧,我觉得工作进程回收这个设置是用来排错使用的。就是如果一个web应用程序用着用着就莫名其妙的出错了,而查不到原因,而重启 IIS或者重启应用程序池就缓解了,这时候就设置一下达到一定条件进行进程回收,但只是暂时的解决方案,最终应该找到原因并修复应用程序。

IIS帮助里也明确说明了设置进程回收的场景,而且说重叠回收中不会断掉tcp链接,会自动把请求平滑过度到新进程中,也就是这个过程中不会引起服务不可用,也就是503错误。

所以我也比较倾向于关掉进程回收选项。



为应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制。进程ID是,IIS6.0经常假死(里面的观点不要无理由地打开回收工作进程和使用工作进程池。一般理由通常是有不明原因的内存泄露、线程挂起等)
http://hi.baidu.com/nayinian/blog/item/468c900fce94dcecab6457f7.html


回收工作进程相关说明(win2003安装iis在ie里键入下面的地址,里面介绍了启用进程回收的时机及重叠回收的概念)
mk:@MSITStore:C:\WINDOWS\Help\iismmc.chm::/htm/ca_recycwrkrprocess.htm



错误定义:503:“服务不可用”错误是一个非自定义的错误,该错误表示服务器当前无法处理该请求。

原因:

1、管理员可能关闭应用程序池以执行维护。
2、当请求到达时应用程序池队列已满。
3、应用程序池标识没有使用预定义账户:网络服务,而自己配置了标识,但是配置的这个用户不属于IIS_WPG组
4、应用程序池启用了CPU监视,并且设置了CPU利用率超过一定百分比关闭应用程序池,而开发人员写的服务端页面(.asp,.aspx)执行效率不高,会引起CPU的长时间占用,最终达到设置的百分比,从而引起应用程序池关闭
5、应用程序池的性能选项卡的请求队列限制所填的数值太小,默认为1000,可修改成一个更大的值,比如说4500.
6、web.config的system.web/httpRuntime节点的appRequestQueueLimit属性设置的值太低。

排查思路:

1、先检查C:\WINDOWS\system32\LogFiles\HTTPERR\httperr1.log,看里面有没有503错误, 503错误是不会记录到C:\WINDOWS\system32\LogFiles\W3SVC1下的,如果503那一行有AppShutdown字样,肯能是由于CPU占用率太高导致自动关闭应用程序池。如果是AppOffline可能是由于应用程序标识出错引起的,如果是Disabled可能是由于管理员手工关闭应用程序池引起的。根据这些信息然后再采取响应措施。
2、根据原因5和原因6来设置更大的请求队列数目。
3、禁用所有应用程序池回收选项。
4、添加ASP.NET\Requests Current,ASP.NET\Requests Queued两个计数器,查看IIS的请求数和队列数。

相关链接:

TechNet V播:HTTP503故障排除(里面提到的可能性不打)
http://www.microsoft.com/china/technet/vcast/live/episode.aspx?newsID=class01_022
\\CXZ.amigo.bjmcc.net\input\503.wmv
IIS 状态代码(里面提到iis状态码及可能原因,其中包括503)
http://support.microsoft.com/kb/318380
如果 AppPoolQueueLength 值是否太低 " HTTP 503 服务不可用 " 错误消息(如果网站访问量比较大也许是这个原因)
http://support.microsoft.com/kb/816995/zh-cn
http://support.microsoft.com/kb/816995/en
FIX: ASP.NET 队列请求太多(该问题是asp.net 1.0的bug,已经有hotfix修复)
http://support.microsoft.com/kb/822148/zh-cn
http://support.microsoft.com/kb/822148/en
<httpRuntime appRequestQueueLimit> 元素(文中提到如何通过配置文件来设置应用程序请求的最大数目)

http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpgenref/html/gngrfhttpruntimesection.asp

客户端请求收到“503:服务不可用”错误(阐述503定义、可能原因及问题排查)
http://technet2.microsoft.com/WindowsServer/zh-CHS/Library/
IIS 6.0入门及进阶webcast(有IIS排错系列)
https://www.microsoft.com/china/technet/webcasts/class/iis.mspx
大家是不是也常遇到服务器不可用啊?Service Unavailable(博客园的一群人讨论503的原因及应该采取的措施)
http://www.cnblogs.com/birdshome/archive/
为应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制。进程ID是,IIS6.0经常假死(里面的观点不要无理由地打开回收工作进程和使用工作进程池。一般理由通常是有不明原因的内存泄露、线程挂起等)
http://hi.baidu.com/nayinian/blog/item/
回收工作进程相关说明(win2003安装iis在ie里键入下面的地址,里面介绍了启用进程回收的时机及重叠回收的概念)
mk:@MSITStore:C:\WINDOWS\Help\iismmc.chm::/htm/ca_recycwrkrprocess.htm
   
0 请登录后投票
时间:2008-04-28
1.kill -3 pid 查看TOMCAT运行情况
2.数据库连接池建议使用ORACLE自带的Connection Pool实现,效率会高很多
3.ORACLE上SQL语句进行调优,查看执行最慢SQL、耗费IO最大SQL等,确认应用瓶颈,提高整体响应性能
4.TOMCAT官方文档认为一般一个CPU支持最大并发在200用户左右,一般建议一个JAVA JVM一般占用768M左右。你的机器配置应该做垂直CLUSTER
   
0 请登录后投票
时间:2008-04-28
调整这个参数 minSpareThreads="25" 试试。

两年前做一个项目,瞬间会有300+客户端连接到Tomcat上,会有部分客户端报告连接超时,无法获取期望的文件。调整这一组参数,加大Tomcat初始化时创建的HTTP处理线程池的大小,可以较好的满足 300+ 客户端的情况。

不过我们后来的设计调整到 3000+ 客户端,所以最终还是在客户端动手脚,时间错开,防止对 Tomcat造成 DDos。

Tomcat 5.5 的文档里对这个做了描述:
http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

引用

At server startup time, this Connector will create a number of request processing threads (based on the value configured for the minSpareThreads attribute). Each incoming request requires a thread for the duration of that request. If more simultaneous requests are received than can be handled by the currently available request processing threads, additional threads will be created up to the configured maximum (the value of the maxThreads attribute). If still more simultaneous requests are received, they are stacked up inside the server socket created by the Connector, up to the configured maximum (the value of the acceptCount attribute. Any further simultaneous requests will receive "connection refused" errors, until resources are available to process them.


如果猜想的不错,就是这个原因导致了Tomcat的客户端超时。

前面Robbin讲的也很对。

如果确实能解决问题,请大体描述一下问题的实际解决过程。 IIS + Tomcat 估计还是很容易杂七杂八的地方出问题。
   
0 请登录后投票
时间:2008-04-28
jwebstar 写道
2.数据库连接池建议使用ORACLE自带的Connection Pool实现,效率会高很多
3.ORACLE上SQL语句进行调优,查看执行最慢SQL、耗费IO最大SQL等,确认应用瓶颈,提高整体响应性能


我晕!
请看清楚,楼主用的是MSSQL2005
   
0 请登录后投票
时间:2008-04-28
我觉得出现以上问题的原因可能是:
1.tomcat的并发请求达不到那么高.
2.数据库单表的记录数太多,导致查询效率下降.
建议:
1.采用tomcat6.0,IO部分采用nio,吞吐能力较5.5有较大的提升
2.采用分库或者分表的方法降低单表数据量,这是针对大数据量时我们通常的做法.
   
0 请登录后投票
时间:2008-04-28
不过连接池的最大链接数20确实小了点,
连接池的最大链接数只要保证小于数据库的最大session、process数就可以了
====================================================
503 ServiceUnavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。
   
0 请登录后投票
时间:2008-04-28
这里引出一个问题,为什么还有大量的框架在使用apache和tomcat。apache有什么用?
很简单,在静态文档方面,apache比tomcat强。
   
0 请登录后投票
时间:2008-04-28
我个人认为你出现了死锁问题,可能是你的应用,也可能是你的数据库!

先排除数据库吧!
   
0 请登录后投票
时间:2008-04-28
java2000_net 写道
我个人认为你出现了死锁问题,可能是你的应用,也可能是你的数据库!

先排除数据库吧!



怎么确定是否是死锁问题?对数据库大部分是只读操作。我有几个后台线程用于检查数据更新、置“已读”标志、发邮件通知等。难道是这里锁住了?

 

   
0 请登录后投票
论坛首页 Java版 Tomcat

跳转论坛:
JavaEye推荐