Red Hat Training

A Red Hat training course is available for Red Hat Ceph Storage

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

如果您在容器中使用 {storage-product},请按照以下步骤生成内核转储文件。该流程涉及捕获内核转储文件的两个场景:

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

或者

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

先决条件

  • 对运行 Ceph 容器的容器节点的根级别访问权限。
  • 安装适当的调试软件包。
  • 安装 GNU Project Debugger(gdb)软件包。

流程

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

    1. 在运行失败的 Ceph 进程的容器上,将内核模式设置为 systemd-coredump 服务,例如:

      [root@mon]# echo "| /usr/lib/systemd/systemd-coredump %P %u %g %s %t %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 监控器和 Ceph Manager 手动捕获核心转储文件

    1. 从容器中获取 Ceph 守护进程的 ceph-mon 软件包详情:

      [root@mon]# docker exec -it NAME /bin/bash
      [root@mon]# rpm -qa | grep ceph

      NAME 替换为 Ceph 容器的名称。

    2. 创建备份副本并打开编辑 ceph-mon@.service 文件:

      [root@mon]# cp /etc/systemd/system/ceph-mon@.service /etc/systemd/system/ceph-mon@.service.orig
    3. 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

    4. 重启 Ceph 监控守护进程:

      语法

      systemctl restart ceph-mon@MONITOR_ID

      MONITOR_ID 替换为 Ceph monitor 的 ID 号。

      示例

      [root@mon]# systemctl restart ceph-mon@1

    5. 在 Ceph 监控容器中安装 gdb 软件包:

      [root@mon]# docker exec -it ceph-mon-MONITOR_ID /bin/bash
      sh $ yum install gdb

      MONITOR_ID 替换为 Ceph monitor 的 ID 号。

    6. 查找进程 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

    7. 生成内核转储文件:

      语法

      gcore ID

      ID 替换为您在上一步中获取的失败进程的 ID,例如 18110:

      示例

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

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

      示例

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

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

      [root@mon]# docker cp ceph-mon-MONITOR_ID:/tmp/mon.core.MONITOR_PID /tmp

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

    10. 恢复 ceph-mon@.service 文件的备份副本:

      [root@mon]# cp /etc/systemd/system/ceph-mon@.service.orig /etc/systemd/system/ceph-mon@.service
    11. 重启 Ceph 监控守护进程:

      语法

      systemctl restart ceph-mon@MONITOR_ID

      MONITOR_ID 替换为 Ceph monitor 的 ID 号。

      示例

      [root@mon]# systemctl restart ceph-mon@1

    12. 上传内核转储文件以获取红帽支持分析,请参阅第 4 步。
  3. Ceph OSD 手动捕获核心转储文件:

    1. 从容器中获取 Ceph 守护进程的 ceph-osd 软件包详情:

      [root@osd]# docker exec -it NAME /bin/bash
      [root@osd]# rpm -qa | grep ceph

      NAME 替换为 Ceph 容器的名称。

    2. 在运行 Ceph 容器的节点中,为同一版本的 ceph-osd 软件包安装 Ceph 软件包:

      [root@osd]# yum install ceph-osd

      如果需要,请先启用适当的存储库。详情请参阅《安装指南 》中的启用红帽 Ceph 存储存储库 一节。

    3. 查找失败的进程的 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
    4. 生成内核转储文件:

      gcore ID

      ID 替换为您在上一步中获取的失败进程的 ID,例如 18110:

      [root@osd]# gcore 18110
      warning: target file /proc/18110/cmdline contained unexpected null characters
      Saved corefile core.18110
    5. 验证核心转储文件是否已正确生成。

      [root@osd]# ls -ltr
      total 709772
      -rw-r--r--. 1 root root 726799544 Mar 18 19:46 core.18110
    6. 上传内核转储文件供红帽支持分析,请参见下一步。
  4. 将核心转储文件上传至红帽支持问题单中。详情请参阅向红帽支持工程师提供信息