11.3. 生成可读的核心转储文件
当 Ceph 守护进程意外终止分段错误时,请收集关于其故障的信息,并将其提供给红帽支持工程师。
此类信息可加快初步调查的速度。此外,支持工程师还可以将核心转储文件中的信息与红帽 Ceph 存储集群已知问题进行比较。
11.3.1. 先决条件 复制链接链接已复制到粘贴板!
安装
ceph-debuginfo软件包(如果尚未安装)。启用包含
ceph-debuginfo软件包的存储库:Red Hat Enterprise Linux 7:
subscription-manager repos --enable=rhel-7-server-rhceph-4-DAEMON-debug-rpms根据 Ceph 节点的类型,将
DAEMON替换为osd或mon。Red Hat Enterprise Linux 8:
subscription-manager repos --enable=rhceph-4-tools-for-rhel-8-x86_64-debug-rpms安装
ceph-debuginfo软件包:[root@mon ~]# yum install ceph-debuginfo
确定安装了
gdb软件包,如果未安装,请安装它:[root@mon ~]# yum install gdb
根据部署类型继续执行此步骤:
11.3.2. 在裸机部署中生成可读的核心转储文件 复制链接链接已复制到粘贴板!
如果您在裸机上使用 Red Hat Ceph Storage,请按照以下步骤生成核心转储文件。
流程
为 Ceph 生成核心转储文件。
通过在
/etc/systemd/system.conf文件中添加以下参数,为内核转储文件设置正确的 ulimit:DefaultLimitCORE=infinity注释掉 Ceph 守护进程服务文件中的
PrivateTmp=true参数,默认位于/lib/systemd/system/CLUSTER_NAME-DAEMON@.service:[root@mon ~]# PrivateTmp=true将
suid_dumpable标志设置为2,以允许 Ceph 守护进程生成转储核心文件:[root@mon ~]# sysctl fs.suid_dumpable=2调整内核转储文件位置:
[root@mon ~]# sysctl kernel.core_pattern=/tmp/core通过在
[Coredump]部分中添加以下行修改/etc/systemd/coredump.conf文件:ProcessSizeMax=8G ExternalSizeMax=8G JournalSizeMax=8G重新载入
systemd服务以使更改生效:[root@mon ~]# systemctl daemon-reload重启 Ceph 守护进程使更改生效:
[root@mon ~]# systemctl restart ceph-DAEMON@ID指定守护进程类型(
osd或mon)及其 ID(OSD 的数字,或 monitor 的短主机名),例如:[root@mon ~]# systemctl restart ceph-osd@1
- 重现失败,例如尝试再次启动 守护进程。
使用 GNU Debugger(GDB)从应用程序核心转储文件中生成可读回追踪:
gdb /usr/bin/ceph-DAEMON /tmp/core.PID指定失败进程的守护进程类型和 PID,例如:
$ gdb /usr/bin/ceph-osd /tmp/core.123456在 GDB 命令提示中,输入设置 pag
并设置日志的命令来禁用分页并启用文件日志:(gdb) set pag off (gdb) set log on通过输入
bt full,将backtrace命令应用到进程的所有线程:(gdb) thr a a bt full在生成回溯追踪后,输入
设置的 log off 来关闭日志记录:(gdb) set log off-
将日志文件
gdb.txt传输到您访问红帽客户门户的系统,并将其附加到支持票据。
11.3.3. 在容器化部署中生成可读的核心转储文件 复制链接链接已复制到粘贴板!
如果您在容器中使用 Red Hat Ceph Storage,请按照以下步骤生成核心转储文件。该流程涉及捕获内核转储文件的两个场景:
- 当 Ceph 进程因为 SIGILL、SIGTRAP、SIGABRT 或 SIGSEGV 错误而意外终止时。
或
- 例如,用于调试 Ceph 进程等问题的手动消耗 CPU 周期较高,或者没有响应。
先决条件
- 对运行 Ceph 容器的容器节点的根级别访问权限。
- 安装适当的调试软件包。
-
安装 GNU Project Debugger(
gdb)软件包。
流程
如果 Ceph 进程因为 SIGILL、SIGTRAP、SIGABRT 或 SIGSEGV 错误意外终止:
在运行失败 Ceph 进程的容器的节点上,将内核模式设置为
systemd-coredump服务,例如:[root@mon]# echo "| /usr/lib/systemd/systemd-coredump %P %u %g %s %t %e" > /proc/sys/kernel/core_pattern监视由于 Ceph 进程导致的下一个容器失败,并在
/var/lib/systemd/coredump/目录中搜索内核转储文件,例如:[root@mon]# ls -ltr /var/lib/systemd/coredump total 8232 -rw-r-----. 1 root root 8427548 Jan 22 19:24 core.ceph-osd.167.5ede29340b6c4fe4845147f847514c12.15622.1584573794000000.xz
为 Ceph 监控器和 Ceph Manager 手动捕获核心转储文件 :
从容器中获取 Ceph 守护进程的
ceph-mon软件包详情:Red Hat Enterprise Linux 7:
[root@mon]# docker exec -it NAME /bin/bash [root@mon]# rpm -qa | grep cephRed Hat Enterprise Linux 8:
[root@mon]# podman exec -it NAME /bin/bash [root@mon]# rpm -qa | grep ceph将 NAME 替换为 Ceph 容器的名称。
创建备份副本并打开 以编辑
ceph-mon@.service文件:[root@mon]# cp /etc/systemd/system/ceph-mon@.service /etc/systemd/system/ceph-mon@.service.orig在
ceph-mon@.service文件中,将这三个选项添加到[Service]部分,每个选项位于单独的行上:--pid=host \ --ipc=host \ --cap-add=SYS_PTRACE \示例
[Unit] Description=Ceph Monitor After=docker.service [Service] EnvironmentFile=-/etc/environment ExecStartPre=-/usr/bin/docker rm ceph-mon-%i ExecStartPre=/bin/sh -c '"$(command -v mkdir)" -p /etc/ceph /var/lib/ceph/mon' ExecStart=/usr/bin/docker run --rm --name ceph-mon-%i \ --memory=924m \ --cpu-quota=100000 \ -v /var/lib/ceph:/var/lib/ceph:z \ -v /etc/ceph:/etc/ceph:z \ -v /var/run/ceph:/var/run/ceph:z \ -v /etc/localtime:/etc/localtime:ro \ --net=host \ --privileged=true \ --ipc=host \1 --pid=host \2 --cap-add=SYS_PTRACE \3 -e IP_VERSION=4 \ -e MON_IP=10.74.131.17 \ -e CLUSTER=ceph \ -e FSID=9448efca-b1a1-45a3-bf7b-b55cba696a6e \ -e CEPH_PUBLIC_NETWORK=10.74.131.0/24 \ -e CEPH_DAEMON=MON \ \ registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest ExecStop=-/usr/bin/docker stop ceph-mon-%i ExecStopPost=-/bin/rm -f /var/run/ceph/ceph-mon.pd-cephcontainer-mon01.asok Restart=always RestartSec=10s TimeoutStartSec=120 TimeoutStopSec=15 [Install] WantedBy=multi-user.target重启 Ceph 监控守护进程:
语法
systemctl restart ceph-mon@MONITOR_ID将 MONITOR_ID 替换为 Ceph monitor 的 ID 号。
示例
[root@mon]# systemctl restart ceph-mon@1在 Ceph 监控容器中安装
gdb软件包:Red Hat Enterprise Linux 7:
[root@mon]# docker exec -it ceph-mon-MONITOR_ID /bin/bash sh $ yum install gdbRed Hat Enterprise Linux 8:
[root@mon]# podman exec -it ceph-mon-MONITOR_ID /bin/bash sh $ yum install gdb将 MONITOR_ID 替换为 Ceph monitor 的 ID 号。
查找进程 ID:
语法
ps -aef | grep PROCESS | grep -v run将 PROCESS 替换为失败进程的名称,如
ceph-mon。示例
[root@mon]# ps -aef | grep ceph-mon | grep -v run ceph 15390 15266 0 18:54 ? 00:00:29 /usr/bin/ceph-mon --cluster ceph --setroot ceph --setgroup ceph -d -i 5 ceph 18110 17985 1 19:40 ? 00:00:08 /usr/bin/ceph-mon --cluster ceph --setroot ceph --setgroup ceph -d -i 2生成内核转储文件:
语法
gcore ID将 ID 替换为您在上一步中获取的失败进程的 ID,例如
18110:示例
[root@mon]# gcore 18110 warning: target file /proc/18110/cmdline contained unexpected null characters Saved corefile core.18110验证核心转储文件是否已正确生成。
示例
[root@mon]# ls -ltr total 709772 -rw-r--r--. 1 root root 726799544 Mar 18 19:46 core.18110在 Ceph 监控容器外部复制内核转储文件:
Red Hat Enterprise Linux 7:
[root@mon]# docker cp ceph-mon-MONITOR_ID:/tmp/mon.core.MONITOR_PID /tmpRed Hat Enterprise Linux 8:
[root@mon]# podman cp ceph-mon-MONITOR_ID:/tmp/mon.core.MONITOR_PID /tmp将 MONITOR_ID 替换为 Ceph monitor 的 ID 号,并将 MONITOR_PID 替换为进程 ID 号。
恢复
ceph-mon@.service文件的备份副本:[root@mon]# cp /etc/systemd/system/ceph-mon@.service.orig /etc/systemd/system/ceph-mon@.service重启 Ceph 监控守护进程:
语法
systemctl restart ceph-mon@MONITOR_ID将 MONITOR_ID 替换为 Ceph monitor 的 ID 号。
示例
[root@mon]# systemctl restart ceph-mon@1- 上传内核转储文件以获取红帽支持分析,请参阅第 4 步。
为 Ceph OSD 手动捕获核心转储文件:
从容器中获取 Ceph 守护进程的
ceph-osd软件包详情:Red Hat Enterprise Linux 7:
[root@osd]# docker exec -it NAME /bin/bash [root@osd]# rpm -qa | grep cephRed Hat Enterprise Linux 8:
[root@osd]# podman exec -it NAME /bin/bash [root@osd]# rpm -qa | grep ceph将 NAME 替换为 Ceph 容器的名称。
在运行 Ceph 容器的节点中,为同一版本的
ceph-osd软件包安装 Ceph 软件包:Red Hat Enterprise Linux 7:
[root@osd]# yum install ceph-osdRed Hat Enterprise Linux 8:
[root@osd]# dnf install ceph-osd如果需要,请先启用适当的存储库。详情请参阅《安装指南 》中的启用红帽 Ceph 存储存储库 一节。
查找失败的进程的 ID:
ps -aef | grep PROCESS | grep -v run将 PROCESS 替换为失败进程的名称,如
ceph-osd。[root@osd]# ps -aef | grep ceph-osd | grep -v run ceph 15390 15266 0 18:54 ? 00:00:29 /usr/bin/ceph-osd --cluster ceph --setroot ceph --setgroup ceph -d -i 5 ceph 18110 17985 1 19:40 ? 00:00:08 /usr/bin/ceph-osd --cluster ceph --setroot ceph --setgroup ceph -d -i 2生成内核转储文件:
gcore ID将 ID 替换为您在上一步中获取的失败进程的 ID,例如
18110:[root@osd]# gcore 18110 warning: target file /proc/18110/cmdline contained unexpected null characters Saved corefile core.18110验证核心转储文件是否已正确生成。
[root@osd]# ls -ltr total 709772 -rw-r--r--. 1 root root 726799544 Mar 18 19:46 core.18110- 上传内核转储文件供红帽支持分析,请参见下一步。
- 将核心转储文件上传至红帽支持问题单中。详情请参阅向红帽支持工程师提供信息。