OBServer 节点 core 掉后如何收集堆栈
本文介绍 OBServer 节点 core 掉后如何排查确认,并收集堆栈。
问题现象
正常运行的 OBServer 突然异常退出。
问题排查
可以通过如下几种方法排查 OBServer 是否 core 掉。
-
执行如下命令查看 OBServer 进程是否存在,若输出为 0 表示进程不存在。
[root@x.x.x.x ~]$ ps -ef | grep 3.1.5 | grep -v grep | wc -l
0 -
查看对应的 OBServer 日志里是否输出
CRASH ERROR关键字,如下所示。[root@x.x.x.x ~]$ grep "CRASH ERROR" /home/admin/ob3.1.5/log/observer.log
CRASH ERROR!!! sig=11, sig_code=0, sig_addr=59ef, timestamp=1683513011732829, tid=27670, tname=observer, trace_id=0-0, extra_info=((null)), lbt=0x9bac9c8 0x9b9d248 0x2ac7a28ac62f 0x2ac7a2f8a9fd 0x2ac7a2f8a893 0x9461d97 0x22ed172 0x2ac7a2ee7554 0x22ebe28 -
查看对应的 OBServer 机器
/etc/sysctl.conf文件中指定的 kernel.core_pattern 位置是否生成对应的 core 文件,如下所示。[root@x.x.x.x ~]$ grep "kernel.core_pattern" /etc/sysctl.conf
kernel.core_pattern = /home/admin/core_test/core-%e-%p-%t
[root@x.x.x.x ~]$ ls -l /home/admin/core_test/core-observer-27670-1683513011
-rw------- 1 admin admin 8723914752 5月 8 10:30 /home/admin/core_test/core-observer-27670-1683513011说明
-
如果没有指定 kernel.core_pattern,默认会在 OceanBase 数据库的
home_path路径下生成core.${ob_pid}的文件。 -
可以通过 ulimit -a 或者 ulimit -c 查看当前资源的限制,如果设置为 0 或者很小则会在发生节点 core 时无法生产 core 文件的情况 。
-
收集堆栈
安装 debuginfo
在收集堆栈之前,需要先安装一下 oceanbase-ce-debuginfo 包。
注意
需安装对应 OceanBase 数据库版本的 oceanbase-ce-debuginfo 包,比如当前使用的 OceanBase 数据库版本为:
Server version: 5.7.25 OceanBase 3.1.5 (r100000252023041721-6d73a6764190f46bbc0805dc27eea5ab08e1920c) (Built Apr 17 2023 21:10:15),则下载对应的 V3.1.5 版本 oceanbase-ce-debuginfo 包。
-
下载的 oceanbase-ce-debuginfo 包
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/oceanbase-ce-debuginfo-3.1.5-100000252023041721.el7.x86_64.rpm -
安装 debuginfo
yum install oceanbase-ce-debuginfo-3.1.5-100000252023041721.el7.x86_64.rpm -y如果执行安装命令时提示如下内容,您可以使用 rpm --force 方式安装,示例入下。
提示信息:
file /usr/lib/debug from install of oceanbase-ce-debuginfo-3.1.5-100000252023041721.el7.x86_64 conflicts with file from package filesystem-3.2-25.el7.x86_64rpm 命令安装:
rpm -ivh --force oceanbase-ce-debuginfo-3.1.5-100000252023041721.el7.x86_64.rpm -
将安装后的 observer.debug 文件拷贝到跟 OBServer 可执行文件同一级目录下
[root@x.x.x.x opt]$ rpm -ql oceanbase-ce-debuginfo | grep observer.debug
/usr/lib/debug/home/admin/oceanbase/bin/observer.debug
[root@x.x.x.x opt]$ cp /usr/lib/debug/home/admin/oceanbase/bin/observer.debug /home/admin/ob3.1.5/bin/
收集堆栈
我们需要借助 addr2line 或者 gdb 来收集发生 core 时刻的堆栈:
-
使用 addr2line 收集堆栈
# 如果没有 addr2line 命令,需要先安装
yum install -y binutils
addr2line -pCfe /home/admin/ob3.1.5/bin/observer 0x9bac9c8 0x9b9d248 0x2b910122b62f 0x2b91019098ed 0x2b9101909783 0x946be28 0x22ed172 0x2b9101866554 0x22e
safe_backtrace at ??:?
oceanbase::common::coredump_cb(int, siginfo_t*) at ??:?
?? ??:0
?? ??:0
?? ??:0
oceanbase::observer::ObServer::wait() at ??:?
main at ??:?
?? ??:0
_start at ??:? -
使用 gdb 命令收集
堆栈分析
可以将堆栈信息发送到社区问答或者给到对应的社区支持人员,社区同学会帮忙分析处理。