プロデューサーノードにおけるprometheusの謎挙動

はじめに

Raspberry Pi4 8GBでCardanoプロデューサーノードを稼働し、3日ぐらい経つと、途端に動作が不安定になる現象と数回遭遇をしています。この現象はシステムを再起動すると改善されるのですが、何が起こっているのか調査をしてみました。

現象の概要

  • 特定プロセスのCPU使用率が常に100%に張り付く
    • 特定プロセス smartmon.sh
問題現象発生時の top 結果 smartmon.shがCPU100%

smartmon.sh が何者かというと、prometheus-node-exporter の一部である prometheus-node-exporter-smartmon.service が実行するスクリプトで、ソースを見る限りでは、HDD,SSDなどのS.M.A.R.T情報をprometheusのメトリクスに変換する用途のようです。
また prometheus-node-exporter-smartmon.timer というものも存在し、こちらは定期的に smartctl を実行してS.M.A.R.T情報を収集する目的に見えます。

復旧方法の調査

毎回システムを再起動して、この問題を解決するのはCardanoノードの一時的な停止を意味しますので、極力避けたいところです。
その為、再起動以外で復旧する方法が無いか実験をしてみました。

実験1: prometheus-node-exporterの再起動

まずは大本である prometheus-node-exporter の再起動を試してみます。

 sudo systemctl restart prometheus-node-exporter.service 

エラーも無くコマンドは実行されましたが、
効果はありませんでした。smartmon.sh が終了せずCPU使用率も100%のままです。

実験2: prometheus-node-exporter-smartmon.service の再起動

続いてprometheus-node-exporter-smartmon.service の再起動を試してみました。

sudo systemctl restart prometheus-node-exporter-smartmon.service

結果は以下の通りで、リスタート要求がタイムアウトしてしまいました。どうやら完全にハングしているようです。

Job for prometheus-node-exporter-smartmon.service failed because a timeout was exceeded.
See "systemctl status prometheus-node-exporter-smartmon.service" and "journalctl -xe" for details.

journalctlで直近100件のログを表示してみると

journalctl --unit=prometheus-node-exporter-smartmon.service -n 100

結果は以下でした。(一部ログを整形)

Jan 03 09:00:29 producer systemd[1]: Starting Collect SMART metrics for prometheus-node-exporter…
Jan 03 09:00:30 producer systemd[1]: prometheus-node-exporter-smartmon.service: Succeeded.
Jan 03 09:00:30 producer systemd[1]: Finished Collect SMART metrics for prometheus-node-exporter.
--------------------
Jan 03 09:15:29 producer systemd[1]: Starting Collect SMART metrics for prometheus-node-exporter…
Jan 03 09:15:30 producer systemd[1]: prometheus-node-exporter-smartmon.service: Succeeded.
Jan 03 09:15:30 producer systemd[1]: Finished Collect SMART metrics for prometheus-node-exporter.
--------------------
Jan 03 09:30:29 producer systemd[1]: Starting Collect SMART metrics for prometheus-node-exporter…
//※ここでログがストップしている

//ここから、サービスリスタート要求操作のログ
Jan 04 11:27:46 producer systemd[1]: prometheus-node-exporter-smartmon.service: Main process exited, code=killed, status=15/TERM
Jan 04 11:29:16 producer systemd[1]: prometheus-node-exporter-smartmon.service: State 'final-sigterm' timed out. Killing.
Jan 04 11:29:16 producer systemd[1]: prometheus-node-exporter-smartmon.service: Killing process 850872 (smartmon.sh) with signal SIGKILL.
Jan 04 11:29:16 producer systemd[1]: prometheus-node-exporter-smartmon.service: Failed with result 'signal'.
Jan 04 11:29:16 producer systemd[1]: prometheus-node-exporter-smartmon.service: Unit process 850872 (smartmon.sh) remains running after unit stopped.
Jan 04 11:29:16 producer systemd[1]: Stopped Collect SMART metrics for prometheus-node-exporter.

ログは以下のセットで構成されており、15分毎に実行されているのがわかります。
1.「Starting Collect SMART metrics …」 から始まるログ
2.「Succeeded.」 で終わるログ
3.「Finished Collect SMART metrics…」 で始まるログ

しかし Jan 03 09:30:29 のログを最後に、15分毎のログが途切れています。
ここでハングしたようですね。
後続の Jan 04 11:27:46 のログは、サービスの再起動を施行した際のログです。

実験3:プロセスの強制終了

サービスの再起動要求時のログから、「KILLシグナルがタイムアウト」したとありますので、実行するまでもなく結果は見えていますが kill系 コマンドでサービスの強制終了を試してみました。

sudo systemctl kill prometheus-node-exporter-smartmon.service
sudo killall smartmon.sh
sudo kill -9 smartmon.sh

上記、操作のいずれもsmartmon.shは稼働したままで終了しませんでした。
いずれもシグナル送信の為、シグナルに反応しなくなった状態には無意味ということですね。

ワークアラウンド

今のところRaspberry Pi ごと再起動する以外に、対処法が見いだせていないので、サービスを無効化してみました。

sudo systemctl disable prometheus-node-exporter-smartmon.service
sudo systemctl disable prometheus-node-exporter-smartmon.timer

私の環境ではS.M.A.R.T情報の監視は行っていないので、無効化による影響はありませんが、 S.M.A.R.T情報 はノード管理において有用な情報の為、いずれ原因を突き止めておきたいものです。

動作確認

サービス無効にして3日が経過しましたが、問題は発生していません。しばらく、このまま様子を見てみたいと思います。

疑問点

  • 同じハードウェア、同じOSのリレーノードでは発生しません。
    プロデューサーノードでのみ発生する理由は?
    • ハードウェア起因の問題?

コメントする