【问题标题】:Tomcat performance issueTomcat 性能问题
【发布时间】: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


【解决方案1】:

您应该设置一个测试环境并尝试通过负载测试重现此环境。
这样你就可以隔离原因。不然因素太多了。
此外,通过这种方式,您可以尝试修复而不会危及您的产品环境。

【讨论】:

    【解决方案2】:

    内存使用可能是原因。
    您应该检查 java 进程的内存使用情况,看看它得到了多少。
    如果还不够,则必须在为 tomcat 设置的任何位置设置 Xmx jvm 参数。

    【讨论】:

    • 今天测试表明 GC 是稳定的,因为我增加了 JPA 实体缓存大小。该应用使用了大约 1.1 GB 的 RAM。
    猜你喜欢
    • 2014-04-23
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2014-09-30
    • 2014-07-23
    • 1970-01-01
    • 2016-08-31
    相关资源
    最近更新 更多