概要
前回までにケースをいろいろ試してみましたが、長期間での安定動作試験をしていました。標準設定では数日間動かしていると速度低下がおこったのでSWAPの設定を変更しました。
OSについて
2023/10/10にRaspberry Pi OSのバージョンがあがり、Debian 11 BullseyeベースからDebian 12 Bookwormに変更がありました。
変更点は上記のサイトにまとまっていましたが、コアなところはそこまで変更されていない印象でした。Raspberry Pi OSはメジャーバージョンアップに対応していないので、新規にインストールをし直しています。
OSは全部で4種類あり、32ビットと64ビットでそれぞれ画面ありの通常版と、画面なしのLite版があります。
Debian 11 Bullseyeでは32ビットがデフォルトになっていましたが、Debian 12 Bookwormからは64ビットが推奨みたいです。
Raspberry Pi Zero 2 Wは64ビットでも32ビットでもどちらでも動かすことが可能ですが、メモリ容量が少ないので32ビットのほうが空きメモリが少し多いとのことですが、特別大きな差はないと思います。
また、画面を使わないのであればLiteを使ったほうが空きメモリは広いはずです。
実験構成
IoT系の構成にしたいので外部からMQTTでデータを送信して、それを蓄えてグラフ化するサーバーにしてみたいと思います。構築方法は環境が安定したところで別途紹介予定ですので、今回は概要紹介のみです。
一番基本となるサーバーとしてNode-REDを使ってみました。
Node-REDはブラウザを利用して、処理のブロックで接続することでプログラムすることができる環境です。受け取ったMQTTデータを若干加工したりすることがあるので、受け取ったデータをそのままデータベースに入れるよりは、なにか加工が可能なサーバーを経由したほうがいいと思います。
そしてNode-REDはノードという拡張機能を利用することができ、MQTTのサーバー機能であるブローカーも内部で起動することが可能です。本来はMosquittoなどのブローカーサーバーを別に起動する構成が一般的ですが、Node-RED上でかんたんに起動できるのでAedes MQTT brokerを利用させてもらいました。
最終的にグラフ化するためにGrafanaというグラフ化ツールを使いました。Kibanaというツールも有名ですが、自分で構築したことがなかったGrafanaを選択しました。時系列データをきれいにグラフ化するためのツールになります。
データベースは迷ったのですがGrafanaとともによく使われているInfluxDBにしました。ちょっとこのデータベースの構築が面倒だと思います。
実験内容
すべてNode-RED上で動かしています。一番上にAedes MQTTブローカーが起動して、その下のinjectによって毎秒パケットを生成してランダムな数字を追加してからrand/aaaというトピックにMQTTで送信しています。
その下はrand/#に受信したMQTTメッセージを受信したらdebug出力と、4つの画面表示と、一番右下でInfluxDBにインサートしています。これだけの処理がNode-REDのみで完結するので便利ですね。
実はデータベースに保存しなくてもグラフ化は可能です。ただしこのデータはNode-RED上で保存されており、再起動すると消えてしまいます。そのため長期間のデータ保存はデータベースのほうが好ましいはずです。
結果
デフォルト設定でこの構成を作ったところ、起動直後はよいのですが翌日ぐらいのなると非常に動作が重くなりました。具体的に言うとNode-REDやGrafanaの画面をブラウザで開くのに非常に時間がかかります。データを見ても若干保存できていないものがありました。
重そうなプロセスを停止しても動作が回復しなかったため、メモリを確認したところSWAP領域を使い切っている状態でした。Raspberry Pi Zero 2 Wはメモリが512Mしか搭載しておらず、SWAPも標準だと100Mのためメモリを600Mまでしか利用することができません。
CONF_SWAPSIZE=100
->
CONF_SWAPSIZE=2048
ためしに/etc/dphys-swapfileを編集して、100Mから2048Mに拡張してみました。現在のところ、この状態で安定しているのでSWAPは100Mでは足りなくなることがあるようでした。
これがいま実験中のマシンのtopをした状態です。RESが内蔵メモリの利用量でSWAPメモリの利用量とRES+SWAPの合計を表すUSEDを追加して、USEDでソートした図になります。これをみるとnode-redとgrafana、influxdと上位3つはグラフ生成に利用しているプロセスになります。lxpanelやXorgなどはGUIでの画面に必要なプロセスなので画面接続していない場合にはLite版のOSを使うことで利用量が減ると思います。
この状態で内蔵メモリとSWAPメモリの利用量の合計は500M前後であり、SWAPがなくても動くように思えますし、デフォルトの100Mで大丈夫な気がしますがだめでした。キャッシュで122M使っていますので、このメモリを考えるとデフォルト設定だと600Mを超えるので遅くなったみたいです。
GUI関連を使わないことで内蔵メモリの利用量を減らすことができるとは思いますが、重い処理を動かすとメモリ利用量があがるので安全のためSWAPを増やすのは必要な気がします。
まとめ
デフォルトの100Mはどう考えても少ないような気がしますが、Raspberry Pi 4などは1Gから8Gまでメモリ搭載量のラインナップがあるので、十分なメモリを搭載している場合には不要な設定かもしれません。
とはいえ、メモリが足りなくなるとOOM Killerなどが動く可能性があるので、安全のためSWAPを大きくしたほうが好ましいとは思いました。
コメント