11.3. 判読可能なコアダンプファイルの生成
Ceph デーモンがセグメンテーション違反で突然終了した場合は、その障害に関する情報を収集し、Red Hat サポートエンジニアに提供します。
このような情報は初期調査を迅速化します。また、サポートエンジニアは、コアダンプファイルの情報を Red Hat Ceph Storage クラスターの既知の問題と比較できます。
11.3.1. 前提条件
ceph-debuginfo
パッケージがインストールされていない場合はインストールします。ceph-debuginfo
パッケージを含むリポジトリーを有効にします。Red Hat Enterprise Linux 7:
subscription-manager repos --enable=rhel-7-server-rhceph-4-DAEMON-debug-rpms
Ceph ノードの種別に応じて、
DAEMON
をosd
またはmon
に置き換えます。Red Hat Enterprise Linux 8:
subscription-manager repos --enable=rhceph-4-tools-for-rhel-8-x86_64-debug-rpms
ceph-debuginfo
パッケージをインストールします。[root@mon ~]# yum install ceph-debuginfo
gdb
パッケージがインストールされていることを確認します。インストールされていない場合は、インストールします。[root@mon ~]# yum install gdb
デプロイメントのタイプに基づいて、手順を続けます。
11.3.2. ベアメタルデプロイメントでの判読可能なコアダンプファイルの生成
ベアメタルで Red Hat Ceph Storage を使用する場合、以下の手順に従ってコアダンプファイルを生成します。
手順
Ceph のコアダンプファイルの生成を有効にします。
/etc/systemd/system.conf
ファイルに以下のパラメーターを追加して、コアダンプファイルに適切なulimits
を設定します。DefaultLimitCORE=infinity
デフォルトでは、
/lib/systemd/system/CLUSTER_NAME-DAEMON@.service
にある Ceph デーモンサービスファイルのPrivateTmp=true
パラメーターをコメントアウトします。[root@mon ~]# PrivateTmp=true
suid_dumpable
フラグを2
に設定して、Ceph デーモンがダンプコアファイルを生成できるようにします。[root@mon ~]# sysctl fs.suid_dumpable=2
コアダンプファイルの場所を調整します。
[root@mon ~]# sysctl kernel.core_pattern=/tmp/core
セクション
[Coredump]
の下に次の行を追加して、/ etc/systemd/coredump.conf
ファイルを変更します。ProcessSizeMax=8G ExternalSizeMax=8G JournalSizeMax=8G
systemd
サービスを再読み込みし、変更を反映します。[root@mon ~]# systemctl daemon-reload
変更を反映するために、Ceph デーモンを再起動します。
[root@mon ~]# systemctl restart ceph-DAEMON@ID
デーモンタイプ (
osd
またはmon
) とその ID (OSD の場合は数値、または Monitors の短縮ホスト名) を指定します。以下に例を示します。[root@mon ~]# systemctl restart ceph-osd@1
- デーモンを再度起動するなど、障害を再現します。
GNU Debugger (GDB) を使用して、アプリケーションのコアダンプファイルから判読可能なバックトレースを生成します。
gdb /usr/bin/ceph-DAEMON /tmp/core.PID
以下のように、デーモンのタイプと失敗したプロセスの PID を指定します。
$ gdb /usr/bin/ceph-osd /tmp/core.123456
GDB コマンドプロンプトで
set pag off
子マンとおよびset log on
コマンドを入力し、ページングを無効にし、ファイルへのロギングを有効にします。(gdb) set pag off (gdb) set log on
backtrace
を入力して、thr a a bt full
コマンドをプロセスのすべてのスレッドに適用します。(gdb) thr a a bt full
バックトレースが生成されたら、
set log off
を入力して電源をオフにします。(gdb) set log off
-
Red Hat カスタマーポータルにアクセスするシステムに
gdb.txt
ログファイルを転送して、サポートチケットにアタッチします。
11.3.3. コンテナー化されたデプロイメントでの判読可能なコアダンプファイルの生成
Red Hat Ceph Storage をコンテナーで使用する場合は、以下の手順に従ってコアダンプファイルを生成します。この手順では、コアダンプファイルを取得する 2 つのシナリオが関係します。
- SIGILL、SIGTRAP、SIGABRT、または SIGSEGV エラーにより、Ceph プロセスが予期せず終了した場合。
または
- 手動の場合。たとえば、Ceph プロセスが高い CPU サイクルを消費したり、応答がないなど、問題を手動でデバッグする場合。
前提条件
- Ceph コンテナーを実行するコンテナーノードへの root レベルのアクセス。
- 適切なデバッグパッケージのインストール
-
GNU Project Debugger (
gdb
) パッケージのインストール。
手順
SIGILL、SIGTRAP、SIGABRT、または SIGSEGV エラーにより、Ceph プロセスが予期せず終了した場合。
障害の発生した 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 Monitors および Ceph Managers のコアダンプファイルを手動でキャプチャーするには、以下を実行します。
コンテナーから Ceph デーモンの
ceph-mon
パッケージの詳細を取得します。Red Hat Enterprise Linux 7:
[root@mon]# docker exec -it NAME /bin/bash [root@mon]# rpm -qa | grep ceph
Red Hat Enterprise Linux 8:
[root@mon]# podman 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
ファイルで、これらの 3 つのオプションを[Service]
セクションに追加します。各オプションは 1 行ずつ追加します。--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 Monitor デーモンを再起動します。
構文
systemctl restart ceph-mon@MONITOR_ID
MONITOR_ID を Ceph Monitor の ID 番号に置き換えます。
例
[root@mon]# systemctl restart ceph-mon@1
Ceph Monitor コンテナーに
gdb
パッケージをインストールします。Red Hat Enterprise Linux 7:
[root@mon]# docker exec -it ceph-mon-MONITOR_ID /bin/bash sh $ yum install gdb
Red Hat Enterprise Linux 8:
[root@mon]# podman 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 Monitor コンテナー外部でコアダンプファイルをコピーします。
Red Hat Enterprise Linux 7:
[root@mon]# docker cp ceph-mon-MONITOR_ID:/tmp/mon.core.MONITOR_PID /tmp
Red Hat Enterprise Linux 8:
[root@mon]# podman 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 Monitor デーモンを再起動します。
構文
systemctl restart ceph-mon@MONITOR_ID
MONITOR_ID を Ceph Monitor の ID 番号に置き換えます。
例
[root@mon]# systemctl restart ceph-mon@1
- Red Hat サポートが分析するコアダンプファイルをアップロードする場合は、ステップ 4 を参照してください。
Ceph OSD のコアダンプファイルを手動でキャプチャーするには、以下を実行します。
コンテナーから Ceph デーモンの
ceph-osd
パッケージの詳細を取得します。Red Hat Enterprise Linux 7:
[root@osd]# docker exec -it NAME /bin/bash [root@osd]# rpm -qa | grep ceph
Red Hat Enterprise Linux 8:
[root@osd]# podman exec -it NAME /bin/bash [root@osd]# rpm -qa | grep ceph
NAME を、Ceph コンテナーの名前に置き換えます。
Ceph コンテナーが実行しているノードに、同じバージョンの
ceph-osd
パッケージ用の Ceph パッケージをインストールします。Red Hat Enterprise Linux 7:
[root@osd]# yum install ceph-osd
Red Hat Enterprise Linux 8:
[root@osd]# dnf install ceph-osd
必要に応じて、適切なリポジトリーを最初に有効にします。詳細は、インストールガイドの Red Hat Ceph Storage の有効化 セクションを参照してください。
障害が発生したプロセスの 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
- Red Hat サポートが分析するコアダンプファイルをアップロードする場合は、次のステップを参照してください。
- Red Hat サポートケースに分析用のコアダンプファイルをアップロードします。詳細は、Red Hat サポートエンジニアへの情報の提供 を参照してください。
11.3.4. 関連情報
- Red Hat Customer Portal の gdb を使用して、アプリケーションコアから読み取り可能なバックトレースを生成する方法
- Red Hat カスタマーポータルの アプリケーションがクラッシュまたはセグメンテーション違反が発生した時にコアファイルのダンプを有効にする