【发布时间】:2009-10-26 02:51:51
【问题描述】:
我有一个运行非常缓慢且偶尔挂起的 Web 应用程序。这是一个与学校相关的 Wicket 应用程序,具有报告和编辑功能,也是一个 servlet,自动化客户端使用它通过 HTTPS 获取/发布数据。
在进行大量编辑/上传/下载的繁忙时段,应用会变得迟缓且无响应。我收到 Wicket“PageMap 仍然锁定”错误。 Tomcat 似乎一直在努力。内存使用是可控的,大约50M。
我设置了 YourKit 来获取一些 profiling 信息,在忙碌期间发现 81% 的 Tomcat CPU 时间都花在了这里:
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 线程陷入困境?
任何人都见过这样的事情,或者对如何测试/故障排除/修复这个问题有任何建议?
【问题讨论】:
-
通过网络传递的数据集有多大?
-
在服务器上编辑单个记录时,所有客户端只下载修改后的记录。 1 或 2 k。如果客户端被重置,它会下载学校的所有数据。可能永远不会超过 5 MB。
-
下载所有数据听起来相当讨厌。客户真的需要所有这些数据吗?你能做一些分页吗?此外,客户端如何获取数据?编写对某种 Web 服务的调用脚本?
-
你确定 CPU 时间花在这里,而不是简单的等待?使用'top'或其他东西来查看CPU使用率是否上升。什么版本的Tomcat,Java?为什么不增加一点堆看看是否有帮助?您有证据表明收集了大量垃圾,这表明系统处于内存压力之下。您如何确定您的应用没有使用所有内存?
-
@popester:客户确实需要数据。我可以分批做,但这会使事情复杂化很多。我正在流式传输它,所以它应该支持大型集。
标签: java apache tomcat ssl wicket