指令集错误:A fatal error … by the Java … Environment:SIGILL (0x4) at pc=0x00007ff349bb3a04, pid=1, ti
目录
说明
这是一次异常错误排查过程,今天遇到客户生产环节tomcat服务异常崩溃,针对tomcat致命错误日志分析,排查记录
日志
#
# A fatal error has been detected by the Java Runtime Environment:
#
# [thread 140682735507200 also had an error]SIGILL (0x4) at pc=0x00007ff349bb3a04, pid=1
, tid=0x00007ff342f9e700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_281-b09) (build 1.8.0_281-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.281-b09 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# [thread 140682869741312 also had an error][thread 140682861348608 also had an error][thread 140682852955904 also had an error][thread 140682563159808 also had an error]
[thread 140682685167360 also had an error]
C [libopenblas.so.0+0xa6aa04] sgemm_oncopy_OPTERON_SSE3+0x4
#
# Core dump written. Default location: /home/ai/ggin/core or core.1
#
# Can not save log file, dump to screen..
#
# A fatal error has been detected by the Java Runtime Environment:
#
[thread 140682693560064 also had an error]#
SIGILL (0x4) at pc=0x00007ff349bb3a04, pid=1, tid=0x00007ff342f9e700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_281-b09) (build 1.8.0_281-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.281-b09 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libopenblas.so.0+0xa6aa04] sgemm_oncopy_OPTERON_SSE3+0x4
#
# Core dump written. Default location: /home/ai/ggin/core or core.1
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
--------------- T H R E A D ---------------
Current thread is native thread
siginfo: si_signo: 4 (SIGILL), si_code: 2 (ILL_ILLOPN), si_addr: 0x00007ff349bb3a04
Registers:
RAX=0x0000000000000930, RBX=0x0000000000000002, RCX=0x0000000000000093, RDX=0x00007ff3dea9c810
RSP=0x00007ff342f9dd98, RBP=0x0000000000000010, RSI=0x0000000000000002, RDI=0x0000000000000093
R8 =0x00007ff33e01d140, R9 =0x00007ff34b1b8120, R10=0x00007ff2bd368fb0, R11=0x00007ff33df9e280
R12=0x00007ff33e01d140, R13=0x0000000000000093, R14=0x0000000000004600, R15=0x0000000000000093
RIP=0x00007ff349bb3a04, EFLAGS=0x0000000000010206, CSGSFS=0x0000000000000033, ERR=0x0000000000000000
TRAPNO=0x0000000000000006
Top of Stack: (sp=0x00007ff342f9dd98)
0x00007ff342f9dd98: 00007ff33e01d140 0000000000000093
0x00007ff342f9dda8: 00007ff349305e0c 00007ff33633b61c
0x00007ff342f9ddb8: 00007ff33df9d040 0000000000000040
0x00007ff342f9ddc8: 0000000000004600 0000000000000093
0x00007ff342f9ddd8: 00000000000001c0 0000000000000012
0x00007ff342f9dde8: 0000000000002bc0 00007ff2bc6453a0
0x00007ff342f9ddf8: 0000000000000004 0000000000000010
0x00007ff342f9de08: 0000000000000001 00007ff33e01d140
0x00007ff342f9de18: 00007ff3362b8710 0000000000002300
0x00007ff342f9de28: 0000000000000000 00000000000008c0
0x00007ff342f9de38: 00007ff3362b89a0 00007ff3dea9a350
0x00007ff342f9de48: 00007ff3362bb5b0 0000000000000012
0x00007ff342f9de58: 0000000000000014 0000000000000093
0x00007ff342f9de68: 0000000000000010 0000000000000002
0x00007ff342f9de78: 0000000000000012 00007ff2bc9653b0
0x00007ff342f9de88: 0000000000004600 0000000000000093
0x00007ff342f9de98: 0000000000000000 0000000000000460
0x00007ff342f9dea8: 0000000000000000 00007ff3362c35b0
0x00007ff342f9deb8: 00007ff3362b8710 00007ff33e01d140
0x00007ff342f9dec8: 00007ff33e01e040 0000000000000000
0x00007ff342f9ded8: e6aed1669a6dad00 0000000000000000
0x00007ff342f9dee8: 000000004e6674b8 00007ff34b1d5d00
0x00007ff342f9def8: 00007ff34b1d5b80 0000000000000180
0x00007ff342f9df08: 00007ff33df9d000 00007ff34b1d5d38
0x00007ff342f9df18: 00007ff34944bd97 0000000000000000
0x00007ff342f9df28: 0000000000000000 0000000000000000
0x00007ff342f9df38: 0000000000000000 00007ff3e4b7a96f
0x00007ff342f9df48: 00007ff342f9e9c0 00007ff3e4b7a9f0
0x00007ff342f9df58: 00007ff3e47506ba 0000000000000000
0x00007ff342f9df68: 00007ff342f9e700 00007ff342f9e700
0x00007ff342f9df78: a207583d60c97277 0000000000000000
0x00007ff342f9df88: 00007ff3e4b7a96f 00007ff342f9e9c0
Instructions: (pc=0x00007ff349bb3a04)
0x00007ff349bb39e4: 66 2e 0f 1f 84 00 00 00 00 00 66 2e 0f 1f 84 00
0x00007ff349bb39f4: 00 00 00 00 0f 1f 84 00 00 00 00 00 41 55 41 54
0x00007ff349bb3a04: 0f 0e 48 8d 0c 8d 00 00 00 00 49 89 f2 49 c1 fa
0x00007ff349bb3a14: 02 0f 8e 65 01 00 00 0f 1f 44 00 00 49 89 d3 4c
Register to memory mapping:
RAX=0x0000000000000930 is an unknown value
RBX=0x0000000000000002 is an unknown value
RCX=0x0000000000000093 is an unknown value
RDX=0x00007ff3dea9c810 is an unknown value
RSP=0x00007ff342f9dd98 is an unknown value
RBP=0x0000000000000010 is an unknown value
RSI=0x0000000000000002 is an unknown value
RDI=0x0000000000000093 is an unknown value
R8 =0x00007ff33e01d140 is an unknown value
R9 =0x00007ff34b1b8120: gotoblas_OPTERON_SSE3+0 in /usr/lib/libopenblas.so.0 at 0x00007ff349149000
R10=0x00007ff2bd368fb0 is an unknown value
R11=0x00007ff33df9e280 is an unknown value
R12=0x00007ff33e01d140 is an unknown value
R13=0x0000000000000093 is an unknown value
R14=0x0000000000004600 is an unknown value
R15=0x0000000000000093 is an unknown value
Stack: [0x00007ff34279e000,0x00007ff342f9f000], sp=0x00007ff342f9dd98, free space=8191k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libopenblas.so.0+0xa6aa04] sgemm_oncopy_OPTERON_SSE3+0x4
错误分析
- SIGILL 表示程序尝试执行一个无效的或不被支持的 CPU 指令。这通常是由于使用了不兼容的代码或指令集导致的。
- 从堆栈信息来看,错误发生在 libopenblas.so.0 中的 sgemm_oncopy_OPTERON_SSE3 函数。OpenBLAS 是一个高效的线性代数库,可能是Java 应用程序在执行某些涉及到矩阵运算的操作时,调用了它。OPTERON SSE3 说明这是为 AMD 的 Opteron 处理器优化的代码。
cpu指令集查看
要检查您的 CPU 是否支持特定的指令集(如 SSE3),可以使用以下方法:
使用 cat /proc/cpuinfo
-
打开终端。
-
输入以下命令查看 CPU 信息:
cat /proc/cpuinfo | grep flags
这将列出 CPU 支持的所有指令集标志。
-
在输出中查找
sse3
关键字。如果存在,则表示您的 CPU 支持 SSE3 指令集。
示例输出
示例输出可能如下:
flags: ... sse3 sse4_1 sse4_2 ...
如果您看到 sse3
,则说明您的 CPU 支持该指令集。
使用 lscpu
另外,您也可以使用 lscpu
命令:
-
输入以下命令:
lscpu
-
在输出中,查找
Flags
行,查看支持的指令集。
额外步骤
如果您需要更详细的信息或想要验证 CPU 的型号,您可以使用以下命令:
lscpu | grep Model
这将显示 CPU 的型号,您可以基于型号在网上查找该处理器的详细规格,以确认支持的指令集。
如果不支持 SSE3
如果您的 CPU 不支持 SSE3,您可能需要:
- 更换硬件:如果可能的话,考虑更换为支持所需指令集的 CPU。
- 使用其他库:如果更换硬件不可行,请考虑使用不依赖于 SSE3 的其他库或实现,以避免此类错误。
总结
通过上述步骤,您可以确认您的 CPU 是否支持所需的指令集,从而帮助您解决与 OpenBLAS 和 Java 应用程序相关的崩溃问题。
SSE3和SSSE3的区别
SSE3(Streaming SIMD Extensions 3)和 SSSE3(Supplemental Streaming SIMD Extensions 3)是两种不同的 SIMD(单指令多数据)指令集扩展,均由 Intel 开发。它们旨在提高处理器在处理多媒体、图形和科学计算等数据并行任务时的性能。以下是这两者的主要区别:
SSE3 (Streaming SIMD Extensions 3)
-
推出时间:
- SSE3 于 2004 年随 Intel 的 Prescott 架构的 Pentium 4 处理器首次推出。
-
指令集功能:
- SSE3 增加了一组新的指令,总计 13 条指令,主要用于增强浮点运算、提高多媒体处理性能和改善在某些算法(如 FFT、逆离散余弦变换等)中的效率。
- 主要功能包括对浮点数进行更高效的加减运算和一些复杂的数学函数。
-
用途:
- SSE3 主要用于提高多媒体应用程序(如视频解码、音频处理)和科学计算的性能。
SSSE3 (Supplemental Streaming SIMD Extensions 3)
-
推出时间:
- SSSE3 于 2006 年随 Intel 的 Core 微架构处理器(例如 Core 2 Duo)首次推出。
-
指令集功能:
- SSSE3 是对 SSE3 的补充,增加了 16 条新指令。它主要增强了对整数数据处理的支持,特别是在视频编解码和图像处理等领域。
- SSSE3 还有一些新的指令用于高效的数据转换、数据重排和其他常见的计算操作。
-
用途:
- SSSE3 适用于对整数和浮点数的更高效处理,尤其是在处理图像、视频和科学计算中的数据集时。
主要区别总结
- 指令数量: SSE3 增加 13 条指令,而 SSSE3 增加 16 条指令。
- 功能焦点: SSE3 主要优化浮点运算,而 SSSE3 增强了对整数处理的支持。
- 推出时间: SSE3 较早,而 SSSE3 是对 SSE3 的补充和扩展。
兼容性
- 支持 SSE3 的 CPU 通常也支持 SSSE3,但反之并不一定成立。如果您需要使用这些指令集,确保您的处理器支持相应的指令集。可以通过查看 CPU 的规格来确认。