10.2. 生成可读内核转储文件
当 Ceph 守护进程意外终止分段错误时,请收集关于其故障的信息,并将其提供给红帽支持工程师。
这些信息可加快初始调查速度。另外,支持工程师可将内核转储文件中的信息与 Red Hat Ceph Storage 集群进行比较。
先决条件
安装 debuginfo 软件包(如果尚未安装)。
启用以下软件仓库来安装所需的 debuginfo 软件包。
示例
[root@host01 ~]# subscription-manager repos --enable=rhceph-6-tools-for-rhel-9-x86_64-rpms [root@host01 ~]# yum --enable=rhceph-6-tools-for-rhel-9-x86_64-debug-rpms
启用软件仓库后,您可以从这个支持的软件包列表中安装您需要的 debug info 软件包:
ceph-base-debuginfo ceph-common-debuginfo ceph-debugsource ceph-fuse-debuginfo ceph-immutable-object-cache-debuginfo ceph-mds-debuginfo ceph-mgr-debuginfo ceph-mon-debuginfo ceph-osd-debuginfo ceph-radosgw-debuginfo cephfs-mirror-debuginfo
确保
gdb
软件包已安装,如果没有安装,请安装它:示例
[root@host01 ~]# dnf install gdb
10.2.1. 在容器化部署中生成可读的内核转储文件
您可以为 Red Hat Ceph Storage 生成内核转储文件,它涉及捕获内核转储文件的两个场景:
- 当 Ceph 进程因为 SIGILL、SIGTRAP、SIGABRT 或 SIGSEGV 错误而意外终止时。
或
- 手动,例如,用于调试 Ceph 进程等问题会消耗大量 CPU 周期,或者没有响应。
先决条件
- 对运行 Ceph 容器的容器节点的根级别访问权限。
- 安装适当的调试软件包。
-
安装 GNU Project Debugger (
gdb
)软件包。 - 确保主机至少有 8 GB RAM。如果主机上有多个守护进程,红帽建议更多 RAM。
流程
如果 Ceph 进程因为 SIGILL、SIGTRAP、SIGABRT 或 SIGSEGV 错误而意外终止:
在运行有故障 Ceph 进程的容器的节点上,将核心模式设置为
systemd-coredump
服务:示例
[root@mon]# echo "| /usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %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 Monitors 和 Ceph OSDs 手动捕获内核转储文件:
获取 MONITOR_ID 或 OSD_ID 并输入容器:
语法
podman ps podman exec -it MONITOR_ID_OR_OSD_ID bash
示例
[root@host01 ~]# podman ps [root@host01 ~]# podman exec -it ceph-1ca9f6a8-d036-11ec-8263-fa163ee967ad-osd-2 bash
在容器中安装
procps-ng
和gdb
软件包:示例
[root@host01 ~]# dnf install procps-ng gdb
查找进程 ID:
语法
ps -aef | grep PROCESS | grep -v run
将 PROCESS 替换为正在运行的进程的名称,如
ceph-mon
或ceph-osd
。示例
[root@host01 ~]# 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@host01 ~]# gcore 18110 warning: target file /proc/18110/cmdline contained unexpected null characters Saved corefile core.18110
验证核心转储文件是否已正确生成。
示例
[root@host01 ~]# ls -ltr total 709772 -rw-r--r--. 1 root root 726799544 Mar 18 19:46 core.18110
在 Ceph 监控容器外部复制内核转储文件:
语法
podman cp ceph-mon-MONITOR_ID:/tmp/mon.core.MONITOR_PID /tmp
将 MONITOR_ID 替换为 Ceph Monitor 的 ID 号,并将 MONITOR_PID 替换为进程 ID 号。
为其他 Ceph 守护进程手动捕获内核转储文件:
登录
cephadm shell
:示例
[root@host03 ~]# cephadm shell
为守护进程启用
ptrace
:示例
[ceph: root@host01 /]# ceph config set mgr mgr/cephadm/allow_ptrace true
重新部署守护进程服务:
语法
ceph orch redeploy SERVICE_ID
示例
[ceph: root@host01 /]# ceph orch redeploy mgr [ceph: root@host01 /]# ceph orch redeploy rgw.rgw.1
退出
cephadm shell
,并登录到部署守护进程的主机:示例
[ceph: root@host01 /]# exit [root@host01 ~]# ssh root@10.0.0.11
获取 DAEMON_ID 并输入容器:
示例
[root@host04 ~]# podman ps [root@host04 ~]# podman exec -it ceph-1ca9f6a8-d036-11ec-8263-fa163ee967ad-rgw-rgw-1-host04 bash
安装
procps-ng
和gdb
软件包:示例
[root@host04 /]# dnf install procps-ng gdb
获取进程的 PID:
示例
[root@host04 /]# ps aux | grep rados ceph 6 0.3 2.8 5334140 109052 ? Sl May10 5:25 /usr/bin/radosgw -n client.rgw.rgw.1.host04 -f --setuser ceph --setgroup ceph --default-log-to-file=false --default-log-to-stderr=true --default-log-stderr-prefix=debug
收集内核转储:
语法
gcore PID
示例
[root@host04 /]# gcore 6
验证核心转储文件是否已正确生成。
示例
[root@host04 /]# ls -ltr total 108798 -rw-r--r--. 1 root root 726799544 Mar 18 19:46 core.6
在容器外复制内核转储文件:
语法
podman cp ceph-mon-DAEMON_ID:/tmp/mon.core.PID /tmp
将 DAEMON_ID 替换为 Ceph 守护进程的 ID 号,并将 PID 替换为进程 ID 号。
- 将核心转储文件上传至红帽支持问题单中。有关详细信息,请参阅向红帽支持工程师提供信息。