2009-10-26 52 views
0

我有一个运行速度非常慢,偶尔挂起的Web应用程序。它是一个与学校有关的Wicket应用程序,具有报告和编辑功能,也是自动化客户端通过HTTPS获取/发布数据的servlet。Tomcat性能问题

在忙于大量编辑/上传/下载过程中,应用程序变得呆滞且无响应。我得到Wicket“PageMap仍然锁定”的错误。雄猫似乎一直在徘徊。内存使用可管理,大约50M。

我成立了YourKit得到一些剖析信息,并在一个繁忙的时期发现的Tomcat的CPU时间的81%是在这里度过的:

org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run() 
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(Object[]) 
org.apache.jk.common.ChannelSocket.processConnection(MsgContext) 
org.apache.jk.common.ChannelSocket.receive(Msg, MsgContext) 
org.apache.jk.common.ChannelSocket.read(MsgContext, byte[], int, int) 
java.io.BufferedInputStream.read(byte[], int, int) 
java.io.BufferedInputStream.read1(byte[], int, int) 
java.io.BufferedInputStream.fill() 
java.net.SocketInputStream.read(byte[], int, int) 
[Wall Time] java.net.SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) 

在这个应用程序,我已经得到了约250客户投票服务器通过SSL请求每30秒更新一次。大多数情况下,这很快就会返回一个空的回应。偶尔会出现一系列数据库活动,并且可能会将大量数据(几MB)发送回客户端。

那么这81%的活动来自哪里?有几个连接速度非常慢的客户端可能导致它等待传入的请求体,从而导致tomcat线程无法工作?

任何人都看过类似的东西,或者对如何测试/疑难解答/修复这个问题有任何建议?

+0

通过电线传递的数据集有多大? – popester 2009-10-26 02:53:42

+0

当在服务器上编辑单个记录时,所有客户端只下载修改后的记录。 1或2 k。如果客户重置,它会下载学校的所有数据。可能不会超过5 MB。 – 2009-10-26 03:37:51

+0

下载所有的数据听起来很讨厌。客户真的需要所有这些数据吗?你可以做一些分页?另外,客户如何获取数据?脚本调用某种Web服务? – popester 2009-10-26 03:47:14

回答

0

您应该设置一个测试环境,并尝试通过负载测试重现此问题。
这样你就可以找出原因。否则,有太多因素。
此外,这种方式可以尝试修复而不会危害您的prod env。

+0

感谢您的支票 - 祝您好运! – thethinman 2009-11-09 18:35:00

0

内存使用可能是原因。
你应该检查java进程的内存使用情况,看它有多少。
如果它不够用,必须设置Xmx jvm参数,无论这些参数是为tomcat设置的。

+0

今天测试显示GC是稳定的,因为我增加了JPA实体缓存大小。该应用程序使用大约1.1 GB的RAM。 – 2009-10-26 15:15:28