我们已经调试这个 JBoss 服务器问题很长时间了。大约工作 10 小时后,服务器陷入 100% CPU 恐慌攻击并停止运行。在此期间您无法运行任何新程序,因此您甚至无法kill -quit
获取堆栈跟踪。这些 100% SYS CPU 负载持续 10-20 秒,并且每隔几分钟重复一次。
我们已经工作了一段时间了。我们怀疑这与GC有关,但无法用较小的程序来证实。我们在 i386 32 位、RHEL5 和 Java 1.5.0_10 上运行,使用-client
and ParNew GC
.
这是我们迄今为止所做的尝试:
我们限制了 CPU 亲和力,以便在高负载时我们可以实际使用服务器。和strace
我们看到一个无限循环SIGSEGV
然后 sig 返回。
我们尝试用 Java 程序重现这一点。确实,SYS CPU% 爬得很高WeakHashMap
或者访问空指针时。问题是fillStackTrace
占用了大量用户 CPU%,这就是为什么我们从未达到 100% SYS CPU。
我们知道,压力10小时后,GC会变得疯狂,Full GC有时需要5秒。所以我们假设这与记忆有关。
jstack
在此期间显示所有线程都被阻塞。pstack
在那段时间里,偶尔会显示 MarkSweep 堆栈跟踪,所以我们也不能确定这一点。发送SIGQUIT
什么也没产生:Java 在 SYS% 加载周期结束后转储了堆栈跟踪。
我们现在尝试用一小段代码重现这个问题,以便我们可以询问 Sun。
如果您知道是什么原因造成的,请告诉我们。我们对想法持开放态度,但我们一无所知,欢迎任何想法:)
谢谢你的时间。
感谢大家的帮助。
最终我们(仅一半的 java 服务器)升级到 JDK 1.6,问题就消失了。只是不要使用 1.5.0.10 :)
我们设法通过仅访问空指针来重现这些问题(提升 SYS 而不是 US,并杀死整个 linux。)
再次感谢大家。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)