11.3. 生成可读的核心转储文件

当 Ceph 守护进程意外终止分段错误时,请收集关于其故障的信息,并将其提供给红帽支持工程师。

此类信息可加快初步调查的速度。此外,支持工程师还可以将核心转储文件中的信息与红帽 Ceph 存储集群已知问题进行比较。

11.3.1. 先决条件

  1. 安装 debuginfo 软件包(如果尚未安装)。

    1. 启用以下软件仓库来安装所需的 debuginfo 软件包。

      示例

      [root@host01 ~]# subscription-manager repos --enable=rhceph-5-tools-for-rhel-8-x86_64-rpms
      [root@host01 ~]# yum --disablerepo='*' --enable=rhceph-5-tools-for-rhel-8-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
  2. 确定安装了 gdb 软件包,如果未安装,请安装它:

    示例

    [root@host01 ~]# dnf install gdb

11.3.2. 在容器化部署中生成可读的核心转储文件

您可以为 {storage-product| 5 生成核心转储文件,它涉及捕获核心转储文件的两种情况:

  • 当 Ceph 进程因为 SIGILL、SIGTRAP、SIGABRT 或 SIGSEGV 错误而意外终止时。

  • 例如,用于调试 Ceph 进程等问题的手动消耗 CPU 周期较高,或者没有响应。

先决条件

  • 对运行 Ceph 容器的容器节点的根级别访问权限。
  • 安装适当的调试软件包。
  • 安装 GNU Project Debugger(gdb)软件包。
  • 确保主机具有至少 8 GB RAM。如果主机上有多个守护进程,红帽建议更多 RAM。

流程

  1. 如果 Ceph 进程因为 SIGILL、SIGTRAP、SIGABRT 或 SIGSEGV 错误意外终止:

    1. 将核心模式设置为运行有故障 Ceph 进程的容器的 systemd-coredump 服务:

      示例

      [root@mon]# echo "| /usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e" > /proc/sys/kernel/core_pattern

    2. 观察因为 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

  2. Ceph MonitorsCeph OSDs 手动捕获内核转储文件:

    1. 获取 MONITOR_IDOSD_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

    2. 在容器中安装 procps-nggdb 软件包:

      示例

      [root@host01 ~]# dnf install procps-ng gdb

    3. 查找进程 ID:

      语法

      ps -aef | grep PROCESS | grep -v run

      PROCESS 替换为正在运行的进程的名称,如 ceph-monceph-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

    4. 生成内核转储文件:

      语法

      gcore ID

      ID 替换为您在上一步中获得的进程的 ID,如 18110

      示例

      [root@host01 ~]# gcore 18110
      warning: target file /proc/18110/cmdline contained unexpected null characters
      Saved corefile core.18110

    5. 验证核心转储文件是否已正确生成。

      示例

      [root@host01 ~]# ls -ltr
      total 709772
      -rw-r--r--. 1 root root 726799544 Mar 18 19:46 core.18110

    6. 在 Ceph 监控容器外部复制内核转储文件:

      语法

      podman cp ceph-mon-MONITOR_ID:/tmp/mon.core.MONITOR_PID /tmp

      MONITOR_ID 替换为 Ceph monitor 的 ID 号,并将 MONITOR_PID 替换为进程 ID 号。

  3. 为其他 Ceph 守护进程手动捕获核心转储文件:

    1. 登录到 cephadm shell

      示例

      [root@host03 ~]# cephadm shell

    2. 为守护进程启用 ptrace

      示例

      [ceph: root@host01 /]# ceph config set mgr mgr/cephadm/allow_ptrace true

    3. 重新部署守护进程服务:

      语法

      ceph orch redeploy SERVICE_ID

      示例

      [ceph: root@host01 /]# ceph orch redeploy mgr
      [ceph: root@host01 /]# ceph orch redeploy rgw.rgw.1

    4. 退出 cephadm shell 并登录到部署守护进程的主机:

      示例

      [ceph: root@host01 /]# exit
      [root@host01 ~]# ssh root@10.0.0.11

    5. 获取 DAEMON_ID 并输入容器:

      示例

      [root@host04 ~]# podman ps
      [root@host04 ~]# podman exec -it ceph-1ca9f6a8-d036-11ec-8263-fa163ee967ad-rgw-rgw-1-host04 bash

    6. 安装 procps-nggdb 软件包:

      示例

      [root@host04 /]# dnf install procps-ng gdb

    7. 获取进程的 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

    8. 收集内核转储:

      语法

      gcore PID

      示例

      [root@host04 /]# gcore 6

    9. 验证核心转储文件是否已正确生成。

      示例

      [root@host04 /]# ls -ltr
      total 108798
      -rw-r--r--. 1 root root 726799544 Mar 18 19:46 core.6

    10. 在容器外复制内核转储文件:

      语法

      podman cp ceph-mon-DAEMON_ID:/tmp/mon.core.PID /tmp

      DAEMON_ID 替换为 Ceph 守护进程的 ID 号,并将 PID 替换为进程 ID 号。

  4. 将核心转储文件上传至红帽支持问题单中。详情请参阅向红帽支持工程师提供信息

11.3.3. 其它资源