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
)软件包。
流程
如果 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
软件包详情:[root@mon]# docker 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
软件包:[root@mon]# docker 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 监控容器外部复制内核转储文件:
[root@mon]# docker 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
软件包详情:[root@osd]# docker exec -it NAME /bin/bash [root@osd]# rpm -qa | grep ceph
将 NAME 替换为 Ceph 容器的名称。
在运行 Ceph 容器的节点中,为同一版本的
ceph-osd
软件包安装 Ceph 软件包:[root@osd]# yum 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
- 上传内核转储文件供红帽支持分析,请参见下一步。
- 将核心转储文件上传至红帽支持问题单中。详情请参阅向红帽支持工程师提供信息。