我有一个在 Sun Application Server 8.1(又名 SJSAS,Glassfish 的前身)上运行的有点过时的 Java EE 应用程序。当有 500 多个并发用户时,应用程序变得慢得令人无法接受,我正在尝试帮助确定大部分执行时间都花在哪里以及可以采取哪些措施来加快速度。到目前为止,我们一直在使用 LoadRunner、应用程序服务器日志、Oracle statpack、snoop 进行实验和测量,调整应用程序服务器接受器和会话(工作线程)线程,调整 Hibernate 批处理大小和连接获取使用等,但在取得了一些初步成果之后我们正在努力进一步改善问题。
好的,通过对问题的介绍,真正的问题是:如果您有一个运行缓慢的 Java EE 应用程序,其 CPU 和内存使用率从未超过 20%,并且在与 500 多个用户一起运行时,您会显示两件事:1)即使在同一个应用程序服务器 JVM 进程内请求静态文件也非常慢,2) 在应用程序服务器 JVM 进程之外但在同一个机器上请求静态文件速度很快,您会调查什么?
我的想法最初跳到了应用程序服务器线程,包括接受器线程和会话线程,认为即使是静态文件的请求也在排队,等待可用的线程,如果 CPU/内存没有真正被占用,那么更多的线程就可以了。但后来我们大幅提升了接受器和会话线程,但没有任何改善。
澄清编辑:
1) 静态文件应该由 Web 服务器而不是应用程序服务器提供服务。我使用的事实是,在我们的例子中,这(不幸的是)不是配置,以便我可以看到它不执行的文件的应用程序服务器性能 - 因此排除任何数据库性能成本等。
2)我认为请求者和应用程序服务器之间没有代理,但即使有,它似乎也不会过载,因为从同一应用程序服务器计算机请求的静态文件但在应用程序的 JVM 实例之外会立即返回。
3) JVM 堆大小 (Xmx) 设置为 1GB。
谢谢你的帮助!
SunONE本身就是一个令人头疼的问题。我有一个非常同样的问题,你知道吗?将同一应用程序简单地重新部署到 Weblogic 即可减少约 30% 的内存消耗和 CPU 消耗。
SunONE 是一个参考实现服务器,不应该用于生产(不了解 Glassfish)。
我知道,这个答案并没有真正的帮助,但我注意到即使在非常简单的操作中也会出现相当大的暂停,例如从池中获取 bean 实例。
也许,尝试在同一台机器上部署 JBoss 或 Weblogic 会给你一个提示?
附:您不应该从应用程序服务器下提供静态内容(尽管有时我也会这样做,当 CPU 充足时)。
附言500 个并发用户是相当高的负载,我肯定会将 SunONE 放在提供静态内容的缓存代理或 Apache 后面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)