2011-05-28 169 views
0

我们使用oracle在JBOSS中运行JAVA应用程序。我们使用了Seam和Hibernate框架。我们面临的问题是,当我们启动应用服务器时,CPU使用率增加,小时,我们发现CPU的利用率接近90%。这是奇怪的,我无法确定问题。应用服务器攻击CPU利用率的原因

Please Help.Thanks in Advance。

干杯, Dwarak enter image description here

+0

没有足够的细节来回答这个问题。如果运行Java应用程序(除了您在此问题中指定的应用程序以外),它是否与使用率相同?*如果您不在应用程序服务器上运行任何Java应用程序,会发生什么情况? – 2011-05-28 05:23:31

回答

0

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

+0

我已经完全监控了我的应用程序,并附上了jconsole堆的截图。请告诉我是否存在内存泄漏 – 2011-05-28 15:55:05

+0

Dócpu分析。 – 2011-05-28 16:28:59

+0

该怎么做? – 2011-05-28 18:38:08

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]'

+0

jstack脚本的+1。 – 2011-05-28 07:12:00

+0

我已经完全监视了我的应用程序,并附上了jconsole堆的截图。请告诉我是否有内存泄漏? – 2011-05-28 15:54:15

+0

我无法读取jconsole堆,因为图像已缩小。但是我可以从内存图中知道你没有内存泄漏。锯齿图案正常健康。这听起来像你有像你怀疑的CPU问题。 – WhiteFang34 2011-05-29 00:34:52

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天的线索可用),这是非常用户友好的。

+0

我已经完全监视了我的应用程序,并附上了jconsole堆的截图。请告诉我是否有内存泄漏 – 2011-05-28 15:57:48

+0

从堆利用率的图上看,这对我来说似乎很正常。堆填满时,调用GC并释放内存。随着时间的推移,似乎没有减少可用内存。但不可能保证这一点。你运行你的应用程序多久了?有时泄漏可能发生在长期执行后。此图表更新时您是否注意到CPU利用率问题? – 2011-05-28 17:51:37

+0

我的CPU利用率增加了4%到65%。我们已经运行了大约7-8小时的应用程序。 – 2011-05-28 20:02:45