はじめに
Raspberry Pi4 8GBでCardanoプロデューサーノードを稼働し、3日ぐらい経つと、途端に動作が不安定になる現象と数回遭遇をしています。この現象はシステムを再起動すると改善されるのですが、何が起こっているのか調査をしてみました。
現象の概要
- 特定プロセスのCPU使用率が常に100%に張り付く
- 特定プロセス smartmon.sh

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のリレーノードでは発生しません。
プロデューサーノードでのみ発生する理由は?- ハードウェア起因の問題?