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


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

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

11.3.1. 先决条件

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

    1. 启用包含 ceph-debuginfo 软件包的存储库:

      Red Hat Enterprise Linux 7:

      subscription-manager repos --enable=rhel-7-server-rhceph-4-DAEMON-debug-rpms
      Copy to Clipboard Toggle word wrap

      根据 Ceph 节点的类型,将 DAEMON 替换为 osdmon

      Red Hat Enterprise Linux 8:

      subscription-manager repos --enable=rhceph-4-tools-for-rhel-8-x86_64-debug-rpms
      Copy to Clipboard Toggle word wrap

    2. 安装 ceph-debuginfo 软件包:

      [root@mon ~]# yum install ceph-debuginfo
      Copy to Clipboard Toggle word wrap
  2. 确定安装了 gdb 软件包,如果未安装,请安装它:

    [root@mon ~]# yum install gdb
    Copy to Clipboard Toggle word wrap

根据部署类型继续执行此步骤:

11.3.2. 在裸机部署中生成可读的核心转储文件

如果您在裸机上使用 Red Hat Ceph Storage,请按照以下步骤生成核心转储文件。

流程

  1. 为 Ceph 生成核心转储文件。

    1. 通过在 /etc/systemd/system.conf 文件中添加以下参数,为 内核转储文件设置正确的 u limit:

      DefaultLimitCORE=infinity
      Copy to Clipboard Toggle word wrap
    2. 注释掉 Ceph 守护进程服务文件中的 PrivateTmp=true 参数,默认位于 /lib/systemd/system/CLUSTER_NAME-DAEMON@.service

      [root@mon ~]# PrivateTmp=true
      Copy to Clipboard Toggle word wrap
    3. suid_dumpable 标志设置为 2,以允许 Ceph 守护进程生成转储核心文件:

      [root@mon ~]# sysctl fs.suid_dumpable=2
      Copy to Clipboard Toggle word wrap
    4. 调整内核转储文件位置:

      [root@mon ~]# sysctl kernel.core_pattern=/tmp/core
      Copy to Clipboard Toggle word wrap
    5. 通过在 [Coredump] 部分中添加以下行修改 /etc/systemd/coredump.conf 文件:

      ProcessSizeMax=8G
      ExternalSizeMax=8G
      JournalSizeMax=8G
      Copy to Clipboard Toggle word wrap
    6. 重新载入 systemd 服务以使更改生效:

      [root@mon ~]# systemctl daemon-reload
      Copy to Clipboard Toggle word wrap
    7. 重启 Ceph 守护进程使更改生效:

      [root@mon ~]# systemctl restart ceph-DAEMON@ID
      Copy to Clipboard Toggle word wrap

      指定守护进程类型(osdmon)及其 ID(OSD 的数字,或 monitor 的短主机名),例如:

      [root@mon ~]# systemctl restart ceph-osd@1
      Copy to Clipboard Toggle word wrap
  2. 重现失败,例如尝试再次启动 守护进程。
  3. 使用 GNU Debugger(GDB)从应用程序核心转储文件中生成可读回追踪:

    gdb /usr/bin/ceph-DAEMON /tmp/core.PID
    Copy to Clipboard Toggle word wrap

    指定失败进程的守护进程类型和 PID,例如:

    $ gdb /usr/bin/ceph-osd /tmp/core.123456
    Copy to Clipboard Toggle word wrap

    在 GDB 命令提示中,输入设置 pag 并设置日志的命令来禁用分页并启用文件日志

    (gdb) set pag off
    (gdb) set log on
    Copy to Clipboard Toggle word wrap

    通过输入 bt full,将 backtrace 命令应用到进程的所有线程:

    (gdb) thr a a bt full
    Copy to Clipboard Toggle word wrap

    在生成回溯追踪后,输入 设置的 log off 来关闭 日志记录:

    (gdb) set log off
    Copy to Clipboard Toggle word wrap
  4. 将日志文件 gdb.txt 传输到您访问红帽客户门户的系统,并将其附加到支持票据。

如果您在容器中使用 Red Hat Ceph Storage,请按照以下步骤生成核心转储文件。该流程涉及捕获内核转储文件的两个场景:

  • 当 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
      Copy to Clipboard Toggle word wrap
    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
      Copy to Clipboard Toggle word wrap
  2. 为 Ceph 监控器和 Ceph Manager 手动捕获核心转储文件

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

      Red Hat Enterprise Linux 7:

      [root@mon]# docker exec -it NAME /bin/bash
      [root@mon]# rpm -qa | grep ceph
      Copy to Clipboard Toggle word wrap

      Red Hat Enterprise Linux 8:

      [root@mon]# podman exec -it NAME /bin/bash
      [root@mon]# rpm -qa | grep ceph
      Copy to Clipboard Toggle word wrap

      NAME 替换为 Ceph 容器的名称。

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

      [root@mon]# cp /etc/systemd/system/ceph-mon@.service /etc/systemd/system/ceph-mon@.service.orig
      Copy to Clipboard Toggle word wrap
    3. ceph-mon@.service 文件中,将这三个选项添加到 [Service] 部分,每个选项位于单独的行上:

      --pid=host \
      --ipc=host \
      --cap-add=SYS_PTRACE \
      Copy to Clipboard Toggle word wrap

      示例

      [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
      Copy to Clipboard Toggle word wrap

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

      语法

      systemctl restart ceph-mon@MONITOR_ID
      Copy to Clipboard Toggle word wrap

      MONITOR_ID 替换为 Ceph monitor 的 ID 号。

      示例

      [root@mon]# systemctl restart ceph-mon@1
      Copy to Clipboard Toggle word wrap

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

      Red Hat Enterprise Linux 7:

      [root@mon]# docker exec -it ceph-mon-MONITOR_ID /bin/bash
      sh $ yum install gdb
      Copy to Clipboard Toggle word wrap

      Red Hat Enterprise Linux 8:

      [root@mon]# podman exec -it ceph-mon-MONITOR_ID /bin/bash
      sh $ yum install gdb
      Copy to Clipboard Toggle word wrap

      MONITOR_ID 替换为 Ceph monitor 的 ID 号。

    6. 查找进程 ID:

      语法

      ps -aef | grep PROCESS | grep -v run
      Copy to Clipboard Toggle word wrap

      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
      Copy to Clipboard Toggle word wrap

    7. 生成内核转储文件:

      语法

      gcore ID
      Copy to Clipboard Toggle word wrap

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

      示例

      [root@mon]# gcore 18110
      warning: target file /proc/18110/cmdline contained unexpected null characters
      Saved corefile core.18110
      Copy to Clipboard Toggle word wrap

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

      示例

      [root@mon]# ls -ltr
      total 709772
      -rw-r--r--. 1 root root 726799544 Mar 18 19:46 core.18110
      Copy to Clipboard Toggle word wrap

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

      Red Hat Enterprise Linux 7:

      [root@mon]# docker cp ceph-mon-MONITOR_ID:/tmp/mon.core.MONITOR_PID /tmp
      Copy to Clipboard Toggle word wrap

      Red Hat Enterprise Linux 8:

      [root@mon]# podman cp ceph-mon-MONITOR_ID:/tmp/mon.core.MONITOR_PID /tmp
      Copy to Clipboard Toggle word wrap

      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
      Copy to Clipboard Toggle word wrap
    11. 重启 Ceph 监控守护进程:

      语法

      systemctl restart ceph-mon@MONITOR_ID
      Copy to Clipboard Toggle word wrap

      MONITOR_ID 替换为 Ceph monitor 的 ID 号。

      示例

      [root@mon]# systemctl restart ceph-mon@1
      Copy to Clipboard Toggle word wrap

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

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

      Red Hat Enterprise Linux 7:

      [root@osd]# docker exec -it NAME /bin/bash
      [root@osd]# rpm -qa | grep ceph
      Copy to Clipboard Toggle word wrap

      Red Hat Enterprise Linux 8:

      [root@osd]# podman exec -it NAME /bin/bash
      [root@osd]# rpm -qa | grep ceph
      Copy to Clipboard Toggle word wrap

      NAME 替换为 Ceph 容器的名称。

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

      Red Hat Enterprise Linux 7:

      [root@osd]# yum install ceph-osd
      Copy to Clipboard Toggle word wrap

      Red Hat Enterprise Linux 8:

      [root@osd]# dnf install ceph-osd
      Copy to Clipboard Toggle word wrap

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

    3. 查找失败的进程的 ID:

      ps -aef | grep PROCESS | grep -v run
      Copy to Clipboard Toggle word wrap

      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
      Copy to Clipboard Toggle word wrap
    4. 生成内核转储文件:

      gcore ID
      Copy to Clipboard Toggle word wrap

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

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

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

11.3.4. 其它资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat