4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

宮崎大学Advent Calendar 2019

Day 4

スプレッドシートでRaspberryPiのリソースモニタを作ってみた

Last updated at Posted at 2019-12-20

はじめに

RaspberryPiでMinecraftサーバーを動かしているのですが、時々CPU温度や使用率を確認したくなる時がありました。

また、公開予定から1週間以上過ぎたアドベントカレンダーの記事をまだ全く書いていなかったのもあり、外出先でもCPU温度などを確認できるリソースモニタ的な何かを作ることにしました。

なお、ソースコードは全てGitHub上に公開しています。

RaspberryPi側環境

  • 機種: RaspberryPi4B (多分他の機種でも行けるはず...)
  • OS: Raspbian Buster Lite
  • 言語: Python 3.7.3
  • Pythonパッケージ: requests (バージョン: 2.21.0)
  • 使用コマンド:vcgencmdfreecatgrep

作ったもの

RaspberryPiのCPU使用率やCPU温度、メモリ使用率などをGoogleスプレッドシートで随時確認できるリソースモニタ的な何かを作りました(下画像)。

なお、グラフは手動で作成します。
online_resouce_monitor_on_minecraft05.PNG

使い方

RaspberryPi側はPythonで、スプレッドシートへデータを設定するためにGoogleAppsScriptを使用しました。

GoogleAppsScript側の準備

1. スプレッドシートを作成する

(省略)

2. スクリプトエディタを開く

スクリプトエディタ01.PNG

3. コードをコピペする。

コードはこちらから取得できます。

下画像を参考にコードを貼り付けてください。
スクリプトエディタ03.PNG

4. 公開する

下の画像と同じ設定にし、deploy ボタンを押す
スクリプトエディタ05.PNG

5. アカウントの設定など(初回のみ)

下画像の許可を確認ボタンを押してください。
スクリプトエディタ06.PNG
その後の画面の指示に従って、ボタンを押していってください。

6. URLの確認

RaspberryPi側の準備で必要になるため、表示されたURLをメモしておいてください。
スクリプトエディタ09.PNG

これでGoogleAppsScript側の準備は完了です。

RaspberryPi側の準備

1. ファイルを取得する

$ wget https://raw.githubusercontent.com/Takahiro55555/PiResourceMonitor/master/src/raspberry/monitor.py
$ wget https://raw.githubusercontent.com/Takahiro55555/PiResourceMonitor/master/src/raspberry/settings.py

2. 設定ファイルを編集する

ここで、先ほどメモしておいたURLをGAS_URLに設定してください。

settings.py
# GoogleAppsScriptのURL
GAS_URL = "GoogleAppsScript側の準備の際にメモしておいたURL"
HOST_NAME = "raspberrypi_test"  # 一意な名前を設定
MAX_LINE = 60  # スプレッドシート側の最大行数(この行数を超えると古い行から削除される)
SAMPLING_INTERVAL_SEC = 3  # 各リソースの状態を取得する間隔

これでRaspberryPi側の準備は完了です。

動作確認とグラフの作成

1. RaspberryPi側の確認

正常に動作することを確認するために、試しに動かしてみます。

$ python3 monitor.py

2. スプレッドシートを確認

下画像のように、新しいシートが作成されデータが設定されていたら成功です。
動作を確認したら、RaspberryPi側のプログラムをCtrl+Cなどを使って停止させます。

なお、シート名は設定ファイルのHOST_NAMEに設定したものを使います。

スプレッドシート01.PNG

3. グラフを適宜作成する

自由にグラフなどを作成してください。

ポイントとして、一旦RaspberryPi側のプログラムを停止させないと、グラフの作成が困難になります。
また、グラフ用のシートとGoogleAppsScriptにより作成されたシートは別にしたほうが見やすいかもしれません。

4. プログラムを起動する

以下のようにすると、端末を閉じてもプログラムを動かし続けることができます。

$ nohup python3 monitor.py &

実装

CPU温度や使用率などは、RaspberryPiからコマンドを実行することで取得・計算しています。
その結果を、GoogleAppsScript側で受け取り、スプレッドシートに記録します。

RaspberryPi側

Python3を使用し実装しました。
CPU温度や使用率などを取得するために、subprocessモジュールを使用しました。
また、データの送信するためのライブラリとしてrequestsを使用しました。

GoogleAppsScript側

GoogleAppsScript側では、受信したデータからシート名やデータのキーから列名を作成、設定するようにしました。
そのため、送信するデータが多少変わってもGoogleAppsScript側のコードの修正が必要になることは少ないと思います。

また、データの行数が設定ファイルのMAX_LINEを超えた分は古い順(タイムスタンプは関係ない)に削除するようにしています。

終わりに

ハマったところ

1. CPU使用率

RaspberryPiのCPU使用率を取得する際、vmstatコマンドを使用していました。しかし、CPU使用率がほぼ変動しないという現象に悩まされました。いろいろ調べてみると、とある記事にたどり着きました。

topコマンドを実行するとCPUやメモリ使用率のサマリ情報がヘッダとして表示されるが、最初に表示されるCPU使用率はOSを起動してからの平均値なので、無風状態が長いほど低い数値が出る。
なお、vmstatで表示されるCPU使用率も同じ仕様なので、パフォーマンス調査などの際には最初の表示は見ない方がいい。

また、manコマンドでvmstatを確認してみたところ、

The first report produced gives averages since the last reboot. Additional reports give information on a sampling period of length delay. The process and memory reports are instantaneous in either case.

同様の記述がありました...

ということで、vmstatコマンドを使用することはあきらめ、こちらのサイトを参考にCPU使用率を計算しています。

このシステムの不備について

現在自分は3秒おきにデータを取得・送信しているのですが、データの並びがタイムスタンプ順にならないことがあります。
順序がおかしいと、グラフがおかしくなるので今後気が向いたら修正したいと思います。


参考文献

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?