尝试在 64 位 linux 机器上诊断一些奇怪的 Tomcat 6 和/或 JVM 错误:
操作系统版本:RED HAT ENTERPRISE LINUX 服务器版本 6.3 (SANTIAGO)
服务器型号:VMWARE 虚拟平台 ()
我正在虚拟机上运行一些应用程序测试并面临一个奇怪的问题。问题发生在某些虚拟机上,其中正好有 2 个进程正在运行:Tomcat 应用程序服务器进程(java 进程)和一个监控进程,在一个随机点,在随机执行几个小时后,可以在 catalina.out 上找到以下消息(服务器日志)失败的VM(问题并不总是发生在同一台机器上):
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 进程,我们尝试将该
-Xrs
标志用于进程的 JVM 参数,但问题仍然存在。java 标志 (
-xrs
) 应该防止 Java 运行时环境处理此类异常信号SIGSEGV
,SIGABRT
但无济于事在添加
xrs
标志之前,我们看到INFO: Pausing Coyote HTTP/1.1 on http-50100
了由于结果信号而发生的错误添加 `xrs 标志后,kettle/tomcat 的行为方式相同,并且在日志文件中没有任何错误的情况下崩溃。
在相关进程上运行 starce 命令会给我们以下输出:
附加进程 12917 - 中断退出 futex(0x7f6b9e8ab9d0,FUTEX_WAIT,12918,NULLPANIC:附加 pid 12917 以 143 退出
我们不能运行
starce -f
以包含所有线程,因为它会导致我们的应用程序卡住。但是,使用命令杀死子进程的kill
行为类似——我们看到父 JVM 退出并出现错误代码 143,我们还看到发送到子进程的信号。我们还使用 java
-XX:+HeapDumpOnOutOfMemoryError
optind 运行,为由于内存不足错误而导致的 jvm 崩溃创建堆转储,但由于崩溃,没有创建核心转储或堆转储。
有任何想法吗?