この度tmchkを更新しました。今回はリアルタイムグラフ表示に対応という大幅な機能変更を含むため、バージョンを1桁大きくしました。初見の方のためにいつも通り説明だけしますが、tmchkはRaspberry PiのCPU温度、使用率、周波数をグラフ化するツールです。インストール方法などの詳細につきましては、以下の記事をご覧ください。この記事はver0.10になって追加された機能、およびその仕様と今後の予定について書かれた記事になります。
更新内容
以下の機能を追加しました。これに伴ってオプションが4つ追加されました。
- リアルタイムでのCPU温度のグラフ表示オプションの追加。("--realtime_temp"オプション)
- リアルタイムでのCPU使用率のグラフ表示オプションの追加。("--realtime_usage"オプション)
- リアルタイムでのCPU動作周波数のグラフ表示オプションの追加。("--realtime_freq"オプション)
- 上記3つのリアルタイムグラフ化を別ウィンドウで同時に行うことができる("--realtime_all"オプション)
また、処理の最適化を行いました。CPU使用率などに特に変化があるわけではないですが、若干I/O負荷を軽減しました。ソースコードを少しだけ整理しました。
細かい仕様は後述の項で説明しますので、各項目について軽く説明します。
追加したオプション4種類は箇条書きにしている通りではありますが、各種パラメータをリアルタイム表示するためのオプションです。gnuplotの都合で"--realtime_all"オプションでも一つのグラフ上に3つのパラメータを同時に表示できないので注意してください。これを用いることにより各種パラメータのリアルタイムグラフ化が可能となりますが、システムへの負荷が増えます。そのため、特定アプリケーションの負荷や、普段の状態を見るという場合に使用することはお勧めできませんが、オーバークロックなどで常に温度を監視する必要があるという場合の需要にこたえた形になります。また、このオプションはGUI環境でのみ正しく動作するため、SSH接続などのCLI上ではリアルタイムでのグラフ化ができませんのでご注意ください。当然ながら前までのバージョンと同じように、PNGフォーマットでの画像で出力することはCLIで可能となっております。
処理の最適化にあたって、I/O負荷を少しでも下げるのはmicroSDへのダメージを少しでも軽減するうえで必要です。システム負荷は変わりませんが、I/O負荷の軽減以外にも若干の高速化も実現しており、すべてを含めて「処理の最適化」としています。ソースコードについて、はこの作業のついでに整理を行って煩雑さを少しマシにしました。
仕様など
リアルタイムでのグラフ化もgnuplotを用いて実現しています。そのため、"--nograph"コマンドを用いた場合でも各種リアルタイムグラフ化オプションを行う場合はgnuplotを必要としますのでご注意ください。また、しれっと書いていますが"--nograph"と"--realtime_xxx"のオプションは併用可能となっております。当然ながら、"--nocsv"や、"--separate"を使用しても問題ありません。
また大事なことなのでもう一度書きますが、"--realtime_all"オプションはあくまで"--realtime_temp"と"--realtime_freq"、"--realtime_usage"のオプションを同時に指定したのと同じ動作になっていて、一つのグラフ上に3つのパラメータを表示させるものではないことに注意してください。"--realtime_all"オプションを作った理由は3つのオプションをいちいち書くのはめんどうだろうということで簡略化させるために作ったオプションですので、面倒でさえなければ、上述の3つのオプションを同時に指定すれば"--realtime_all"と同じ動作をしてくれるということです。また、このオプション時はリアルタイムで描写するためにシステム負荷がかかるので、CPUリソースを使い切っていないと正しいCPU使用率は表示できないと思います。システム負荷がどれくらいになるかというと、"--realtime_all"ありなしで負荷がどれくらい違うかを検証したものが以下の画像です。Raspberry Pi 4Bをxrdpを用いてリモートデスクトップ接続をして使用しています。
見ての通りですが、最初のときにプロセスを複数立ち上げるために一気に負荷がかかります。そのあとは多少落ち着くものの、約15から20%ぐらいオプションありのほうが高いCPU使用率となっているので、どうしてもリアルタイムで監視する必要がなければ切っておくのがおすすめです。あとグラフを3つ書けばプロセスが3つ作成されて負荷が一番かかるので、必要な計測データのみ表示するのがお勧めです。少なくともこの画像よりは負荷は小さくなるはずです。CSV出力のみで、GUIの環境でなければwebサーバを動かしているRaspberry Pi3ですら以下のような使用率に抑えることができます。
Raspberry Pi 3B+ですら平均CPU使用率を7%程度に収められるので、データを取るだけならCLI環境で測定してグラフを書くのが一番です。どこかのバージョンの更新記事でも書きましたが、グラフの作成はデータを全部取り終わってから作成しているので、リアルタイム描写さえしなければ非常に低負荷で計測が行えます。なので、"--realtime_xxx"オプションを使うタイミングというのは結構限られてくると思いますが、どうしても熱暴走の可能性があって常に見張っている必要がある場合などに限られてくるのではないかと思います。なのでシステム負荷がかかるということを念頭に置いたうえでこの新しいオプションをご利用いただきますようお願いします。
加えてグラフの更新間隔なのですが、これはサンプリング周期に合わせていますが、負荷がかかっていたりすると正しい待ち時間より遅くなる可能性も考えられるので、ある程度の正確さで動いているというだけで厳密に正しい周期で動いているわけでないということも注意してください。なので、具体例を出すと場合によっては1秒おきに更新されるように設定しても、2秒後にデータが反映されたり、2秒後に一気に2つのデータ分の描写を行う可能性があるということです。
あとはこのオプションを使用するとプログラム終了の際にエラーが表示されます。このエラーはgnuplotによるエラー表示になっていて、参照していたデータファイルが強制的に消されることによってそのようなエラーがでます。以下が表示されるエラーです。
"/tmp/rttemp.cmd" line 529: warning: Cannot find or open file "/tmp/data.csv"
"/tmp/rttemp.cmd" line 529: No data in plot
"/tmp/rtfreq.cmd" line 529: warning: Cannot find or open file "/tmp/data.csv"
"/tmp/rtfreq.cmd" line 529: No data in plot
"/tmp/rtusage.cmd" line 529: warning: Cannot find or open file "/tmp/data.csv"
"/tmp/rtusage.cmd" line 529: No data in plot
QFileSystemWatcher::removePaths: list is empty
QFileSystemWatcher::removePaths: list is empty
QFileSystemWatcher::removePaths: list is empty
QFileSystemWatcher::removePaths: list is empty
QFileSystemWatcher::removePaths: list is empty
QFileSystemWatcher::removePaths: list is empty
このエラーがどうにかできないのかという話なのですが、gnuplotをリアルタイム表示する場合は、いくつか方法があるのですが、基本的には延々とデータを参照していって終わりはコマンドで終了という方式をとらないといけないんですね。これなんですが、簡単に言うと計測が終わっても何もしなければウィンドウが残ってしまうということなんです。プロセスを切り離してもそうでなくてもC言語上から正常に終了させることはできません。なので参照元のデータファイルが消えるタイミングで勝手にウィンドウが閉じてくれるのを利用して閉じているのですが、その代わりにエラーメッセージがどうしても出てしまうというわけです。なのでこのエラーメッセージが出ることは問題ありませんし、仕様というわけです。無視してくださいって最後に英語でも書いておきました。これでオプションの仕様の説明はおしまいです。
処理の最適化ですが、CPU使用率、動作周波数は今まで内部的にはsystem関数を用いてコマンドラインから結果を外部出力し、その結果を読み取る方式を採用していたのですが、これはディスクへの負荷もあるのでpopen関数で直接取得するようにしたことでI/O負荷を低減、かつ遅い主記憶装置を挟まないようにしたことで若干の高速化を実現しています。中身が気になる方は下の外部リンクのGitHubからソースをみて調べてみてくださいね。
今後の予定
大きな更新をしたのでするべきことはだいぶ減りました。前々回で公表してた、「1m」や「1h」みたいな記録時間を文字で簡略化するのは次のやつでできればやってみようと思います。あまりにも処理が複雑化しそうだったりメインプロセスが低速になりそうだったらしないつもりですが、頭で思い浮かべる限りは大丈夫そうです。
あとはファイルパスのチェック機能と自動フルパス変換は少し考えています。現状では絶対パスによる記述が必要ですが、これを相対パスの入力ならその入力に合わせて変換したりできるようにしようかなと思っています。不具合というわけでもないのですが、不正なパスだったり、存在しないパスを入力すると文字化けしておかしな終了の仕方をするのでそれを防げるように改良してみようかと考えています。あとは現状で内部的には最後の.pngという部分を見ていません。なのでPNGの絶対パスを"/hoge/hoge"みたいな感じで入れてもプログラムが始まってしまうのでこの部分も改善しようかと思います。もちろん処理が低速にはならないというのであればという前提ですが。
それ以外にもこんな機能あればなとかリクエストがあればGitHubまたは、コメントにどうぞ。返信をしない場合もあるかと思いますが、必ず目を通させてもらっています。