【前編】に引き続いてNode-REDでCPU温度を可視化を行っていきます。
【前編】では以下の作業を行いました。
- RaspberryPiのCPU温度設定を取得
- Node-REDのDashboardノードのインストール
【後編】では以下のようなことを行っていきます。
- Node-REDのフローを作成しDashboard化
- Raspberry Pi 4Bに負荷をかけて温度変化をみる
- Raspberry Pi 4Bに熱対策を施してどれぐらい違いがあるかをみる
【参考】
Node-REDでDashboardを作成する
【前編】では定期的にコマンド実行して、CPU温度を取得、debugノード
で表示というところまで行いました。あとはdashboardに表示する要素ノードという形で追加していきます。
今回はグラフを使用して可視化を行うので、dashboardカテゴリの中からchartノード
を使用します。
chartノード
はグラフ化する機能を持っていますが、グラフの種類は以下のものに対応しています。
折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどに対応しています。鶏頭図(Polar area chart)というグラフにも対応しているようです。鶏頭図は棒グラフと円グラフのハイブリッドな形式のようです。
今回は温度変化を見たいので折れ線グラフ(Line Chart)に設定していきます。chartノード
をクリックしてプロパティを開きます。
今回編集するのは以下の4つの項目になります。グラフを見やすくするためにはもう少し編集してもいいかなと思いますが最低限このぐらいは編集しておいたほうがいいかなという項目だけをあげています。
- Group
- Label
- Type
- X-axis Label
Groupの編集
まずは【Group】を変更していきます。【Group】はダッシュボードを作成した際の配置位置などに関わる項目になります。
まだ、何もGroupを作っていない状況なので、 chartノードのプロパティの表示の【Group】の値の右にある【ペンのアイコン】ボタンをクリックします。
dashboard groupのプロパティの表示に切り替わります。画面中の【タブ】の値の右にある【ペンのアイコン】ボタンをクリックします。こちらも新規にタブを作成していくことになります。
すると、今度は新規にdashboard tabノードの設定を追加のプロパティの表示に切り替わります。画面中の【名前】の値を変更していきます。今回はRaspberryPi状態
と変更しています。この値はダッシュボードにも表示されるので、わかりやすい名前にすることをおすすめします。
ちなみに表示の階層構造はタブ
→ Group
→ 表示アイテムのLabel(今回の場合はchartノード)
という構造となっています。このあたりは触りながら理解していくことをオススメします。また、一度作成した階層構造は再利用もできます。今回の作業は次回は再利用することで省くことができます。
値の変更を行ったら上部にある【更新】ボタンをクリックします。
dashboard tabノードを編集の表示に戻るので今度は【名前】の値を変更します。ここはグラフの表題になるような名称になるので、CPU温度
としました。
値の変更を行ったら画面上部の【更新】ボタンをクリックします。
そして、いよいよchartノードのプロパティの表示に戻ります。先程までの値の編集によりGroupの値は[RaspberryPi状態]CPU温度
と変更されているのを確認します。
あとはタブ内の値を順次変更していきます。
【Label】の値を今回は温度なのでTemp
と変更しました。
続いて【Type】の値をLine chart
にします。この値がデフォルト値になっています。ここを変更することでグラフの形式を変更することができます。
最後は【X-axis Label】を変更します。この値はx軸の表示形式となります。
今回はHH:mm
(時:分)形式にしました。年、月、日を表示させるといったことも可能なので、可視化には十分な機能があると思います。
値の変更を確認して…
これで今回の設定は完了となります。変更した値の最終確認を行ったら、画面上部の【完了】ボタンをクリックします。これで【chartノード】の設定は完了となります。
ここまでの設定が終わると【ダッシュボード】タブの【配置】が以下のようになっていると思います。
先程の表示の階層構造タブ
→ Group
→ chartノードのLabel
が見た目にもわかるようになっています。名称の値はここから変更することも可能です。初回設定時は適当に入力し、ここに表示させてから変更するほうが楽かもしれません。
ダッシュボードを表示するにはこの画面の右ボタンをクリックします。このボタンの名称ってなんていうのだろうか?【Windowを開く】ボタンって感じ?
データが何もなくても構成だけは描画できるのでテストしてみるのも手です。グラフはありませんが、ラベルなどは表示されているのがわかります。
では、【前編】で作成したフローの温度を取得したexecノード
の後段に配置します。
で実行するのですが…一向にグラフの描画が行われません。
そこでdebugノード
を確認したところ、原因がわかりました。実行結果がtemp=46.0'C
という形式になっていて、数値以外の文字列が含まれているからでした。
そのため、payloadの値を数値だけにするため、changeノード
を使用します。
changeノード
をフローエディタに配置したら…
payloadの不要な文字列を削除(空白文字に置換)する設定を入れておきます。正規表現で1つのルールで削除するのでもいいのですが、面倒なので2つのルールで削除しました。
最終的には以下のようなフローになります。
これでRaspberryPiの温度計測をダッシュボードに表示させることができました。実行するとCPU温度がグラフ化されて表示されています。
Raspberry Pi 4B
のCPU温度を計測する
通常の状態でCPUの温度を測っても仕方ないので、ベンチマークソフトも使用します。
使用するベンチマークソフトはUnixBench
を使用しました。以下から取得することができます。
インストールといってもgit
を使用してクローンするだけですが。ベンチマークの実行はクローンしたディレクトリ内のbyte-unixbench/UnixBench
にあるRun
を実行します。以下を行うとインストールと実行ができます。
$ git clone https://github.com/kdlucas/byte-unixbench
$ cd byte-unixbench/UnixBench
$ ./Run
温度計測環境
計測環境はベンチマーク(UnixBench
)以外にもWindows10からリモートデスクトップ接続し、Chromiumブラウザを立ち上げておくことに統一します。
計測当日の室温は24℃程度でした。
熱対策未対応
ベンチマーク結果
------------------------------------------------------------------------ Benchmark Run: 日 5月 10 2020 18:18:59 - 18:46:56 4 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 10217509.4 lps (10.0 s, 7 samples) Double-Precision Whetstone 2385.6 MWIPS (9.6 s, 7 samples) Execl Throughput 896.7 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 112341.6 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 31241.2 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 318185.6 KBps (30.0 s, 2 samples) Pipe Throughput 159456.7 lps (10.0 s, 7 samples) Pipe-based Context Switching 43377.6 lps (10.0 s, 7 samples) Process Creation 1862.5 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 2622.2 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 755.8 lpm (60.1 s, 2 samples) System Call Overhead 491969.1 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 10217509.4 875.5 Double-Precision Whetstone 55.0 2385.6 433.7 Execl Throughput 43.0 896.7 208.5 File Copy 1024 bufsize 2000 maxblocks 3960.0 112341.6 283.7 File Copy 256 bufsize 500 maxblocks 1655.0 31241.2 188.8 File Copy 4096 bufsize 8000 maxblocks 5800.0 318185.6 548.6 Pipe Throughput 12440.0 159456.7 128.2 Pipe-based Context Switching 4000.0 43377.6 108.4 Process Creation 126.0 1862.5 147.8 Shell Scripts (1 concurrent) 42.4 2622.2 618.5 Shell Scripts (8 concurrent) 6.0 755.8 1259.6 System Call Overhead 15000.0 491969.1 328.0 ======== System Benchmarks Index Score 321.5 ------------------------------------------------------------------------ Benchmark Run: 日 5月 10 2020 18:46:56 - 19:14:57 4 CPUs in system; running 4 parallel copies of tests Dhrystone 2 using register variables 38395536.5 lps (10.0 s, 7 samples) Double-Precision Whetstone 9327.8 MWIPS (9.8 s, 7 samples) Execl Throughput 2689.4 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 209787.8 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 57541.0 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 592232.5 KBps (30.0 s, 2 samples) Pipe Throughput 603560.9 lps (10.0 s, 7 samples) Pipe-based Context Switching 187767.6 lps (10.0 s, 7 samples) Process Creation 4779.6 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 5800.4 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 748.2 lpm (60.2 s, 2 samples) System Call Overhead 1866372.1 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 38395536.5 3290.1 Double-Precision Whetstone 55.0 9327.8 1696.0 Execl Throughput 43.0 2689.4 625.4 File Copy 1024 bufsize 2000 maxblocks 3960.0 209787.8 529.8 File Copy 256 bufsize 500 maxblocks 1655.0 57541.0 347.7 File Copy 4096 bufsize 8000 maxblocks 5800.0 592232.5 1021.1 Pipe Throughput 12440.0 603560.9 485.2 Pipe-based Context Switching 4000.0 187767.6 469.4 Process Creation 126.0 4779.6 379.3 Shell Scripts (1 concurrent) 42.4 5800.4 1368.0 Shell Scripts (8 concurrent) 6.0 748.2 1247.0 System Call Overhead 15000.0 1866372.1 1244.2 ======== System Benchmarks Index Score 838.3
80℃オーバーってなんだよ。RaspberryPi 3B
とかだと67℃ぐらいしか行かないのですが、RaspberryPi 4B
ではここまで高温になってしまいます。RaspberryPi 4B
は一応80℃から85℃ぐらいで保護機能が働いて、CPUがクロックダウンするようです。そのため、クロックダウンが発生するとかなりベンチマークの値は悪くなると予想されます。
クロックダウンがあるとしても、真夏になって負荷の高いことをすると、もしかしたら熱暴走するかも。冷却できない場合には扇風機必須のような状況でした。プラスチックケースはやめたほうが良さそう。
簡易ヒートシンクで熱対応
さっきの状態を見て無対策動作するのは正直無謀だろという感じなので、手持ちであったヒートシンクをつけてみました。あんまり効果があるとは思いませんでしたが、形状は割と大きめのものだったので効果はあったようです。
温度の変化
ベンチマーク結果
------------------------------------------------------------------------ Benchmark Run: 日 5月 10 2020 11:41:13 - 12:09:12 4 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 10201933.9 lps (10.0 s, 7 samples) Double-Precision Whetstone 2385.7 MWIPS (9.6 s, 7 samples) Execl Throughput 892.3 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 113391.4 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 32138.4 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 314013.6 KBps (30.0 s, 2 samples) Pipe Throughput 159352.2 lps (10.0 s, 7 samples) Pipe-based Context Switching 42987.8 lps (10.0 s, 7 samples) Process Creation 1857.3 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 2569.3 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 738.7 lpm (60.1 s, 2 samples) System Call Overhead 494045.3 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 10201933.9 874.2 Double-Precision Whetstone 55.0 2385.7 433.8 Execl Throughput 43.0 892.3 207.5 File Copy 1024 bufsize 2000 maxblocks 3960.0 113391.4 286.3 File Copy 256 bufsize 500 maxblocks 1655.0 32138.4 194.2 File Copy 4096 bufsize 8000 maxblocks 5800.0 314013.6 541.4 Pipe Throughput 12440.0 159352.2 128.1 Pipe-based Context Switching 4000.0 42987.8 107.5 Process Creation 126.0 1857.3 147.4 Shell Scripts (1 concurrent) 42.4 2569.3 606.0 Shell Scripts (8 concurrent) 6.0 738.7 1231.1 System Call Overhead 15000.0 494045.3 329.4 ======== System Benchmarks Index Score 320.6 ------------------------------------------------------------------------ Benchmark Run: 日 5月 10 2020 12:09:12 - 12:37:14 4 CPUs in system; running 4 parallel copies of tests Dhrystone 2 using register variables 40535432.4 lps (10.0 s, 7 samples) Double-Precision Whetstone 9536.9 MWIPS (9.6 s, 7 samples) Execl Throughput 2661.0 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 220190.7 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 60699.6 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 612824.1 KBps (30.0 s, 2 samples) Pipe Throughput 605107.7 lps (10.0 s, 7 samples) Pipe-based Context Switching 194150.1 lps (10.0 s, 7 samples) Process Creation 4706.6 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 5874.6 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 806.7 lpm (60.2 s, 2 samples) System Call Overhead 1861585.6 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 40535432.4 3473.5 Double-Precision Whetstone 55.0 9536.9 1734.0 Execl Throughput 43.0 2661.0 618.8 File Copy 1024 bufsize 2000 maxblocks 3960.0 220190.7 556.0 File Copy 256 bufsize 500 maxblocks 1655.0 60699.6 366.8 File Copy 4096 bufsize 8000 maxblocks 5800.0 612824.1 1056.6 Pipe Throughput 12440.0 605107.7 486.4 Pipe-based Context Switching 4000.0 194150.1 485.4 Process Creation 126.0 4706.6 373.5 Shell Scripts (1 concurrent) 42.4 5874.6 1385.5 Shell Scripts (8 concurrent) 6.0 806.7 1344.6 System Call Overhead 15000.0 1861585.6 1241.1 ======== System Benchmarks Index Score 860.0
20℃ぐらい下がって60℃までに治まったというところです。正直期待してなかったのですが割と以外です。これなら真夏でもなんとか持ちこたえられるかな。
つよつよヒートシンク+FAN
をつけて熱対策
簡易ヒートシンクはまあまあ冷えましたが、さらに熱対策の最終兵器を投入!
SeeedさんのICE Tower CPU Cooling Fan for Pi 4
を使用しました。
圧倒的にでかいヒートシンクに58mmサイズのFANがついています。FANの電源はGPIOから5VとGNDを接続します。電源を入れるとファンがLEDでグラデーションしながら光るというド派手使用。ページでは動作温度は80℃から40℃に下がりました
と記載されてました。
同様のファンは52Piというブランドで販売されていますが、このシリーズは冷却性能では実績があるもののようです。
本製品は52Piによりデザインされます。52Piは世界リードのRaspberry Piアクセサリメーカーであり、Raspberry Pi対応の様々なHAT、スクリーンなどアクセサリのデザインや生産などを行います。
購入はSeeedさんのサイト(Bazaar)か、以下で購入可能です。(amazonでは2020.05.11現在品切れのようです)
箱の様子
RaspberryPi4へ装着した様子
ファンについたLEDがRGBで色々変化するのは楽しいですが、ケースには入れられないよな~
温度の変化
ベンチマーク結果
------------------------------------------------------------------------ Benchmark Run: 日 5月 10 2020 19:51:20 - 20:19:16 4 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 10204604.5 lps (10.0 s, 7 samples) Double-Precision Whetstone 2381.7 MWIPS (9.6 s, 7 samples) Execl Throughput 844.4 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 112051.5 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 31316.7 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 309951.1 KBps (30.0 s, 2 samples) Pipe Throughput 155928.1 lps (10.0 s, 7 samples) Pipe-based Context Switching 41558.5 lps (10.0 s, 7 samples) Process Creation 1601.6 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 2579.4 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 703.4 lpm (60.0 s, 2 samples) System Call Overhead 489764.4 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 10204604.5 874.4 Double-Precision Whetstone 55.0 2381.7 433.0 Execl Throughput 43.0 844.4 196.4 File Copy 1024 bufsize 2000 maxblocks 3960.0 112051.5 283.0 File Copy 256 bufsize 500 maxblocks 1655.0 31316.7 189.2 File Copy 4096 bufsize 8000 maxblocks 5800.0 309951.1 534.4 Pipe Throughput 12440.0 155928.1 125.3 Pipe-based Context Switching 4000.0 41558.5 103.9 Process Creation 126.0 1601.6 127.1 Shell Scripts (1 concurrent) 42.4 2579.4 608.4 Shell Scripts (8 concurrent) 6.0 703.4 1172.4 System Call Overhead 15000.0 489764.4 326.5 ======== System Benchmarks Index Score 311.0 ------------------------------------------------------------------------ Benchmark Run: 日 5月 10 2020 20:19:16 - 20:47:20 4 CPUs in system; running 4 parallel copies of tests Dhrystone 2 using register variables 39608588.1 lps (10.0 s, 7 samples) Double-Precision Whetstone 9232.8 MWIPS (9.6 s, 7 samples) Execl Throughput 2520.6 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 204987.5 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 56605.8 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 588234.4 KBps (30.0 s, 2 samples) Pipe Throughput 579679.8 lps (10.0 s, 7 samples) Pipe-based Context Switching 156344.5 lps (10.0 s, 7 samples) Process Creation 4352.3 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 5586.7 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 767.9 lpm (60.2 s, 2 samples) System Call Overhead 1799377.6 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 39608588.1 3394.1 Double-Precision Whetstone 55.0 9232.8 1678.7 Execl Throughput 43.0 2520.6 586.2 File Copy 1024 bufsize 2000 maxblocks 3960.0 204987.5 517.6 File Copy 256 bufsize 500 maxblocks 1655.0 56605.8 342.0 File Copy 4096 bufsize 8000 maxblocks 5800.0 588234.4 1014.2 Pipe Throughput 12440.0 579679.8 466.0 Pipe-based Context Switching 4000.0 156344.5 390.9 Process Creation 126.0 4352.3 345.4 Shell Scripts (1 concurrent) 42.4 5586.7 1317.6 Shell Scripts (8 concurrent) 6.0 767.9 1279.8 System Call Overhead 15000.0 1799377.6 1199.6 ======== System Benchmarks Index Score 807.0
ベンチマークが開始されて一瞬50℃を超える事がありましたが、47℃-48℃程度の温度に落ち着いていました。
対策していない場合が80℃オーバーになることを考えるとかなりの効果があるかなと思います。ただ、この状態でもUSBコネクタ近辺は熱を持っててかなり温かい感じでした。このあたりも季節によっては冷却してほしいなあというところです。とはいうものの、これならオーバークロックもあり得るかなという印象をうけました。
おわりに
Node-RED
を使ってRaspberryPi 4B
のCPU温度を表示するダッシュボードを作ってみました。正直ここまで簡単にダッシュボードが作成できるとは思っていませんでした。センサーをいろいろとつなげて、いろいろな状態を表示するにはもってこいかなと思います。自分の所属するNode-RED UserGroup Tokai
でもダッシュボードの使い方を知りたいという方は割と多くいました。今後コミュニティでダッシュボードのワークショップを行うのもありかも。
あとRaspberryPi 4B
の動作温度がかなり高い事がわかりました。真夏に向けてある程度、熱対策を行っておいたほうがいいような印象です。今回使用したつよつよヒートシンク+FAN
はやりすぎかもしれませんが、金属ケース形状のヒートシンクなどもあるのでそういうのは使用したほうが懸命でしょう。
例えば、以下のようなものが該当します。
やっぱりRaspberryPi 4B
は速い!サーバー用途にもパワーを発揮してくれそうな感じですね。
今回作成したフローも参考のため、末尾においておきます。
【参考】
【今回作成したフロー】
[ { "id": "204fd68d.545d2a", "type": "tab", "label": "フロー 1", "disabled": false, "info": "" }, { "id": "1582e329.da80bd", "type": "exec", "z": "204fd68d.545d2a", "command": "vcgencmd measure_temp", "addpay": false, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "", "x": 370, "y": 120, "wires": [ [ "4eae35a7.6eec4c" ], [], [] ] }, { "id": "4d47cdbb.4bfbd4", "type": "inject", "z": "204fd68d.545d2a", "name": "定期実行(15秒)", "topic": "", "payload": "", "payloadType": "date", "repeat": "15", "crontab": "", "once": true, "onceDelay": 0.1, "x": 170, "y": 60, "wires": [ [ "1582e329.da80bd" ] ] }, { "id": "4eae35a7.6eec4c", "type": "change", "z": "204fd68d.545d2a", "name": "", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "temp=", "fromt": "str", "to": "", "tot": "str" }, { "t": "change", "p": "payload", "pt": "msg", "from": "'C", "fromt": "str", "to": "", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 580, "y": 180, "wires": [ [ "cdbc6d1.876909", "c24f39e6.3af3d8" ] ] }, { "id": "cdbc6d1.876909", "type": "ui_chart", "z": "204fd68d.545d2a", "name": "", "group": "62bffcd3.8c4c44", "order": 0, "width": 0, "height": 0, "label": "Temp", "chartType": "line", "legend": "false", "xformat": "HH:mm", "interpolate": "linear", "nodata": "", "dot": false, "ymin": "", "ymax": "", "removeOlder": 1, "removeOlderPoints": "", "removeOlderUnit": "3600", "cutout": 0, "useOneColor": false, "useUTC": false, "colors": [ "#1f77b4", "#aec7e8", "#ff7f0e", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5" ], "useOldStyle": false, "outputs": 1, "x": 770, "y": 240, "wires": [ [] ] }, { "id": "c24f39e6.3af3d8", "type": "debug", "z": "204fd68d.545d2a", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "x": 790, "y": 180, "wires": [] }, { "id": "62bffcd3.8c4c44", "type": "ui_group", "z": "", "name": "CPU温度", "tab": "9712eeb9.323d8", "order": 1, "disp": true, "width": "6", "collapse": false }, { "id": "9712eeb9.323d8", "type": "ui_tab", "z": "", "name": "RaspberryPi状態", "icon": "dashboard", "disabled": false, "hidden": false } ]