RaspberryPiの電源とスロットリング。PrometheusとGrafanaでの監視。

techrpi


今回のバージョン

ハードウェア: Raspberry Pi 3B+
OS: Raspbian GNU/Linux 10 (buster)

Raspberry Pi の電源は、拾ってきたてきとうなACアダプタを使うことが多い。 ACアダプタやケーブルの状態によっては、電源が不安定なこともある。それに、最初は問題なくても、長期間運用していると、電源が不安定になることがある。

電源が不安定なときは、赤い電源ランプが不安げにちかちかと点滅するような気がする。このステータスは、ソフトウェアで取得できる。

sudo dmesg

Screenshot 2022-07-29 at 12.33.01.png

最初に見たときは 「Undervoltage detected 」という赤いメッセージがびっしりと表示されているのを見てびっくりした。メッセージのとおり、電源に問題があると解釈して、すぐにACアダプタを交換した。

ステータスチェックと監視

この Undervoltage という状態は、vcgencmd get_throttled で取得できる

$ vcgencmd get_throttled
> throttled=0x50000

get_throttledは、スロットル機能の状態を取得するコマンド。Raspberry Pi は、電源不足や熱などによって、スロットリング(=システムの処理速度制限)を行う。 HEXで現在のステータスや、過去スロットリングが発生したかを取得できる。 詳しくは、Raspberry Pi の公式ドキュメントに書かれている。

https://www.raspberrypi.com/documentation/computers/os.html#get_throttled

監視する

node-exporterで公開する

RaspberryPi のステータスをすでに家庭内の PrometheusとGrafanaで監視する仕組みを構築していたので、そこに、get_throttled のステータスも追加できないか調べてみた。

GitHubでは、多くの有志が prometheus-node-exporter で vcgencmd の値をメトリクスとして出力するスクリプトを公開している。なかでも get_throttled のステータスを公開しているものは限られる。今回は、下記のリポジトリのスクリプトを使わせてもらうことにした。

https://github.com/urpylka/prometheus-raspberry-exporter

まず手順どおりにスクリプトをインストールする。すると、 /var/lib/node_exporter/textfile_collector/raspberry-metrics.prom ファイルにステータスが書き出される。そしたら、node-exporterで textfile collectorを有効にすることでメトリクスを公開できる。 node-exporter の設定もあわせて参照する。

https://github.com/prometheus/node_exporter

node-exporterの起動オプションに次のように追記する

—collector.textfile.directory /var/lib/node_exporter/textfile_collector

node-exporterを再起動し、ホストのポート 9100 にアクセスして、メトリクスが取れていることを確認する

curl localhost:9100/metrics | grep rpi_

また、Prometheus側でこのホストをスクレイピングするように設定しておく。

Grafanaで表示する

あらかじめPrometheusをデータソースとして設定してある。

こんな感じでパネルを描画してみる。

スクリーンショット 2022-07-30 15.35.07.png

できた。余計なビットも表示されているけど。 これでアラートも設定できるというものだ。 というか、実はけっこうな頻度でスロットル発生してやばいな。

他にも、同じスクリプトで電圧値( vcgencmd measure_volts で取れる値であり、ACアダプタの電圧ではない)やクロック周波数が取得できるが、これらの値は、スロットリングのタイミングとは相関していないように見える。CPUの電圧やクロックが下がらないようにもっと別のレベルでスロットリングしているんだろうか。