Java应用服务器性能

Java应用服务器性能,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,我在Sun application Server 8.1(也称为SJSAS,Glassfish的前身)上运行了一个有点过时的Java EE应用程序。由于有500多个用户同时使用,应用程序的速度变得令人无法接受,我试图帮助确定大部分执行时间都花在了哪里,以及可以做些什么来加快执行速度。到目前为止,我们已经对LoadRunner、应用服务器日志、Oracle statpack、snoop、调整应用服务器接受器和会话(工作线程)、调整Hibernate批处理大小和加入获取使用等进行了试验和测量,但在取

我在Sun application Server 8.1(也称为SJSAS,Glassfish的前身)上运行了一个有点过时的Java EE应用程序。由于有500多个用户同时使用,应用程序的速度变得令人无法接受,我试图帮助确定大部分执行时间都花在了哪里,以及可以做些什么来加快执行速度。到目前为止,我们已经对LoadRunner、应用服务器日志、Oracle statpack、snoop、调整应用服务器接受器和会话(工作线程)、调整Hibernate批处理大小和加入获取使用等进行了试验和测量,但在取得一些初步成果后,我们正在努力进一步改进

好的,通过对这个问题的介绍,这里有一个真正的问题:如果一个运行缓慢的Java EE应用程序在一个CPU和内存使用率从未超过20%的机器上运行,而在500多名用户上运行时,你会发现两件事:1)在同一个app server JVM进程中请求静态文件的速度非常慢,2)在app server JVM进程之外但在同一个框中请求静态文件速度很快,您会调查什么

我最初的想法是跳到应用服务器线程上,包括接受线程和会话线程,认为即使是静态文件的请求也在排队等待可用线程,如果CPU/内存没有被真正占用,那么更多的线程就可以正常工作了。但随后我们大量增加了接受线程和会话线程,没有任何改进

澄清编辑:

1) 静态文件应该由web服务器而不是应用服务器提供。我使用的是这样一个事实,在我们的例子中(不幸的是),这不是配置,因此我可以看到应用程序服务器不执行的文件的性能——因此不包括任何数据库性能成本,等等

2) 我不认为请求者和应用服务器之间存在代理,但即使存在代理,它似乎也不会过载,因为从同一应用服务器机器请求的、但在应用程序JVM实例之外的静态文件会立即返回

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


谢谢你的帮助

SunONE本身就是个麻烦事。我也有同样的问题,你知道吗?将同一个应用程序简单地重新部署到Weblogic,可将内存消耗和CPU消耗降低约30%

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

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

也许,尝试在同一台机器上部署JBoss或Weblogic会给你一个提示

另外,您不应该从ApplicationServer下提供静态内容(尽管我有时也会这样做,当CPU充足时)


p.p.S.500个并发用户的负载相当高,我肯定会将SunONE放在缓存代理或Apache后面,后者提供静态内容。

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

-XX:+DisableExplicitGC-XX:+AggressiveHeap


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

请求在到达SJSA之前是否已代理(通过Apache等)?据我所知,请求未代理。请求直接从LoadRunner计算机发送到应用程序服务器进程。但这是一个很好的建议,值得确认,因此我毫不怀疑。我确认后会发布更新。谢谢你看过JVM堆大小了吗?digitalsanctum和matt b,我已经在原始问题的澄清编辑部分回答了你的问题。谢谢你的应用程序使用EJB吗?检查池/缓存大小,必要时增加GC在几乎为空的堆上每2秒运行一次是否会影响性能?确切地说,有多“伟大”?