我在虚拟机上运行一些应用程序测试,并面临一个奇怪的问题。该问题发生在某些虚拟机上,其中正好有两个进程正在运行:Tomcat应用程序服务器进程(Java进程)和监视器进程,在执行了一些随机小时后的某个随机点上,可以在失败的VM的catalina.out(服务器日志)中找到以下消息(该问题并不总是发生在同一台机器上)。操作系统版本:RED HAT ENTERPRISE LINUX SERVER RELEASE 6.3(SANTIAGO)
服务器型号:VMWARE VIRTUAL PLATFORM()
org.apache.coyote.http11.Http11Protocol pause
INFO: Pausing Coyote HTTP/1.1 on http-50100
INFO: Stopping service Catalina
org.apache.coyote.http11.Http11Protocol destroy
INFO: Stopping Coyote HTTP/1.1 on http-8080
在此时刻,Tomcat进程已关闭,执行失败。 内存或CPU使用情况上没有任何提示。 在/var/logs下也没有看到任何系统消息。
在第一阶段,我们怀疑外部信号正在杀死我们的Tomcat进程,并尝试使用进程的JVM参数
-Xrs
标志,但问题仍然存在。Java标志(
-xrs
)应该防止Java运行时环境处理异常信号,如SIGSEGV
和SIGABRT
,但没有帮助。在添加
xrs
标志之前,我们看到INFO: Pausing Coyote HTTP/1.1 on http-50100
错误发生,因为结果信号。在添加了
xrs
标志后,kettle/tomcat的行为方式相同,并且在日志文件中没有任何错误。对相关进程运行starce命令会给我们以下输出:
Process 12917 attached - interrupt to quit futex(0x7f6b9e8ab9d0, FUTEX_WAIT, 12918, NULLPANIC: attached pid 12917 exited with 143
我们无法运行
starce -f
来包含所有线程,因为它会导致我们的应用程序被卡住。 但是,使用kill
命令杀死son进程的行为类似-我们看到父JVM退出,并显示发送给子进程的信号。我们还使用java
-XX:+HeapDumpOnOutOfMemoryError
选项运行,以便在由于内存不足而导致jvm崩溃时创建堆转储,但由于崩溃而没有创建任何核心转储或堆转储。
有什么想法吗?