はじめに
RaspberryPiでMinecraftサーバーを動かしているのですが、時々CPU温度や使用率を確認したくなる時がありました。
また、公開予定から1週間以上過ぎたアドベントカレンダーの記事をまだ全く書いていなかったのもあり、外出先でもCPU温度などを確認できるリソースモニタ的な何かを作ることにしました。
なお、ソースコードは全てGitHub上に公開しています。
RaspberryPi側環境
- 機種: RaspberryPi4B (多分他の機種でも行けるはず...)
- OS: Raspbian Buster Lite
- 言語: Python 3.7.3
- Pythonパッケージ: requests (バージョン: 2.21.0)
- 使用コマンド:
vcgencmd
、free
、cat
、grep
作ったもの
RaspberryPiのCPU使用率やCPU温度、メモリ使用率などをGoogleスプレッドシートで随時確認できるリソースモニタ的な何かを作りました(下画像)。
使い方
RaspberryPi側はPythonで、スプレッドシートへデータを設定するためにGoogleAppsScriptを使用しました。
GoogleAppsScript側の準備
1. スプレッドシートを作成する
(省略)
2. スクリプトエディタを開く
3. コードをコピペする。
コードはこちらから取得できます。
4. 公開する
5. アカウントの設定など(初回のみ)
下画像の許可を確認
ボタンを押してください。
その後の画面の指示に従って、ボタンを押していってください。
6. URLの確認
RaspberryPi側の準備で必要になるため、表示されたURLをメモしておいてください。
これで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
に設定してください。
# 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
に設定したものを使います。
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秒おきにデータを取得・送信しているのですが、データの並びがタイムスタンプ順にならないことがあります。
順序がおかしいと、グラフがおかしくなるので今後気が向いたら修正したいと思います。