应用程序服务器积极利用CPU的原因

时间:2011-05-28 05:19:26

标签: java performance jboss seam cpu-usage

我们正在使用oracle在JBOSS中运行JAVA应用程序。我们使用了Seam和Hibernate框架。我们面临的问题是,当我们启动应用程序服务器时,cpu utlizations增加,一小时后我们发现CPU utilizaiton已关闭到90%。这是奇怪的,我无法确定问题。

请帮助。谢谢。

干杯, Dwarak enter image description here

3 个答案:

答案 0 :(得分:4)

理想情况下,您可以使用分析器来追踪问题。如果您不能在环境中使用分析器(如生产),那么尝试在其他地方重现它并在那里附加分析器。通常这可能很难,所以这里有一个技巧我已经多次使用命令行查找生产中CPU利用率的原因:

watch -n1 'jstack [pid] | grep -A 1 RUNNABLE | grep -v RUNNABLE | grep -v \\-\\- | grep -v socketRead0 | grep -v socketAccept`

如果您在短时间内观看此内容,您可能会看到一些常用方法被调用。接下来将完整的jstack输出抓取到文件:

jstack [pid] > jstack.log

现在在文件中搜索您经常看到的方法之一。从堆栈跟踪中,您通常可以找到负责磨削CPU的代码。如果没有任何显示,那么也许你的时间将过多的垃圾收集,你只需要增加内存。您可以使用:

`jmap -heap [pid]`

更好地了解内存使用情况。更好的是,您可以附加jvisualvm或商业资料分析器(如YourKit),以便随着时间的推移以图形方式查看它。我偶尔也使用watch -n1 'jmap -heap [pid]'

答案 1 :(得分:4)

  • 首先,确保它是由JBoss执行的占用CPU的进程。如果您使用Linux使用top命令,或者在Windows中,请使用任务管理器监视运行JBoss的java进程的CPU利用率。
  • 如果是这种情况,请查看服务器日志文件以查看在此期间发生的情况。它是真的做了一些重要的工作,还是当你的应用程序空转时CPU利用率很高?
  • 确保系统中有足够的可用内存用于操作系统。如果jboss进程占用了所有可用内存,则操作系统将没有足够的内存用于它自己的活动,这可能导致颠簸(将页面交换进出虚拟内存,从而占用CPU)。
  • 确保为JVM提供了足够的堆内存。您可以在JBoss的bin目录中的run.conf文件中增加这些值。当堆大小对于您的应用程序来说太小时,可能会发生颠簸。此外,如果堆大小太大(例如超过2GB),那么GC堆的时间也会占用你的CPU。
  • 运行JBoss时检查计算机上的磁盘I / O.如果将日志级别设置为非常低的值,并且如果JBoss最终编写大量日志文件,那么这也可能导致CPU使用率过高(用于写入日志文件!)。
  • 如果您使用的是JDK 1.5.0.10,请查看此链接。 My JBoss server hits 100% SYS CPU on Linux; what can cause this?

如果上述任何内容都没有帮助,那么最后一种方法是使用分析工具。我建议使用JProfiler或Yourkit Profiler(商业,但可以使用30天的路径),这是非常用户友好的。

答案 2 :(得分:0)

使用分析器查找问题。如果使用Oracle Java 6,请从JDK中的jvisualvm开始。