Java应用服务器性能

我在Sun Application Server 8.1(又名SJSAS,Glassfish的前身)上运行了一个有点过时的Java EE应用程序。 有500多个并发用户,应用程序变得非常缓慢,我正在尝试帮助确定大部分执行时间花在哪里以及可以采取哪些措施加快速度。 到目前为止,我们一直在使用LoadRunner,应用服务器日志,Oracle statpack,snoop,调整应用服务器接受器和会话(工作线程)线程,调整Hibernate批量大小和连接获取使用等进行实验和测量,但经过一些初步收益我们正在努力改善问题。

好的,通过对问题的介绍,这里有一个真正的问题:如果你的CPU和内存使用从未超过20%的盒子上运行的Java EE应用程序速度慢,而且在运行500多个用户时你会看到两件事:1)在相同的应用服务器JVM进程中请求甚至静态文件的速度非常慢,2)请求在应用服务器JVM进程之外但在同一个盒子上的静态文件很快,你会调查什么?

我的想法最初跳到应用程序服务器线程,包括接受器和会话线程,认为即使对静态文件的请求正在排队,等待可用的线程,如果CPU /内存没有真正征税,那么更多的线程按顺序排列。 但随后我们大幅提升了接受者和会话线程,并没有任何改进。

澄清编辑:

1)静态文件应由Web服务器而不是app服务器提供。 我使用的事实是,在我们的情况下,这(不幸的是)不是配置,以便我可以看到它不执行的文件的应用程序服务器性能 – 因此排除任何数据库性能成本等。

2)我认为请求者和应用服务器之间没有代理,但即使它没有被重载,因为从同一应用服务器机器请求但在应用程序的JVM实例之外的静态文件立即返回。

3)JVM堆大小(Xmx)设置为1GB。

谢谢你的帮助!

SunONE本身就是一个痛苦的屁股。 我有一个同样的问题,你知道吗? 将同一应用程序简单地重新部署到Weblogic可将内存消耗和CPU消耗减少约30%。

SunONE是一个参考实现服务器,不应该用于生产(不了解Glassfish)。

我知道,这个答案并没有真正帮助,但我注意到即使在一个非常简单的操作中也会出现相当多的停顿,例如从池中获取bean实例。

可能是,尝试在同一台机器上部署JBoss或Weblogic会给你一个提示吗?

PS你不应该从应用程序服务器下面提供静态内容(虽然我有时也会这样做,当CPU很丰富时)。

PPS 500并发用户的负载非常高,我将SunONE定义为缓存代理或Apache,它提供静态内容。

在使用Sun性能监视工具之后,我们发现垃圾收集器每隔几秒运行一次,并且只使用了1GB堆中的大约100MB。 所以我们尝试添加以下JVM选项,到目前为止,这个新配置大大提高了性能。

-XX:+ DisableExplicitGC -XX:+ AggressiveHeap

请参阅http://java.sun.com/docs/performance/appserver/AppServerPerfFaq.html

我们的教训:不要将JVM选项调整和垃圾收集调整留到最后。 如果您遇到性能问题,请在故障排除过程的早期查看这些设置。