Mein Blog

IOBroker´s Schreibvolumen reduzieren

Der IOBroker ist eine coole Software um die vielfältigsten Systeme zu vereinen. Dazu rufen Adapter die Daten ab und stellen Kommandos zum steuern bereit. Die Daten werden dabei hierarisch gespeichert. Die Persistierung ist dabei sehr simple. Das Datenobjekt wird als JSON auf die Platte geschrieben. Bei vielen tausend Datenpunkten wird diese Datei aber recht groß und viele Schreibvorgänge erzeugen “Traffic”.

Das wäre nicht unbedingt das Problem, meine NVME kann das locker ab. Aber was ich in den Statistiken dann gesehen habe ich das Schreibvolumen auf die Platte:

Und Schreibvorgänge sind nicht gut für die Lebensdauer der Festwertspeicher.
Also ging ich auf Suche und sah, dass ioBroker zyklich die objects.json speichert die 50MB umfasste. Mittels dem Programm iotop konnte man in der kumulierenden Ansicht sehen, dass schnell GigaBytes an Daten zusammen kommen.

Die Lösung

Eine Möglichkeit wäre natürlich ein träges Dateisystem was als Cache fungiert. Aber besser ist das “Backend” vom IOBroker zu ändern. Das kann man umstellen auf CouchDB oder auch redis. 

Meine Wahl fiel auf redis da es “Leichtgewichtiger” ist. Was ioBroker nur leider noch nicht kann bzw. ich noch nicht gefunden habe, ist die Möglichkeit zur Authentifizierung gegenüber redis. Auth per Token geht leider nicht. Da muss ich mal noch forschen. Gerade für den Multihostbetrieb brauch man eine geschützte Datenbank.

Die Umstellung

Installation redis

$ sudo apt update 
$ sudo apt install redis-server

Durch die Problematik mit der Auth empfiehlt sich eine Installation auf der ioBroker Maschine. 

Redis ist in dem Moment noch nicht “systemverwaltet” das sollte man in der /etc/redis/redis.conf anpassen:

sudo systemctl restart redis.service

Danach kann man den Status abfragen:

sudo systemctl status redis

Jetzt kann man testen:Umstellung ioBroker

Als ersten muss man ioBroker mit stop beenden. Man kann auch mit “pkill io” alles schnell beenden 🙂

dann startet man das custom setup und trägt die Daten ein

iobroker setup custom
Type of objects DB [(f)ile, (c)ouch, (r)edis], default [file]: r
Host / Unix Socket of objects DB(file), default[127.0.0.1]: >ENTER
Port of states DB (redis), default[6379]: >ENTER
Type of states DB [(f)file, (r)edis], default [file]: r
Host / Unix Socket of states DB (redis), default[127.0.0.1]: >ENTER 
Port of states DB (redis), default[6379]: >ENTER
Data directory (file), default[../../../iobroker-data/]: >ENTER
Host name of this machine [iobroker]: >ENTER
creating conf/iobroker.json

Es folgt die Migration von File auf redis. Mit den ganzen Dateien kann das schon 10min dauern bei größeren Installationen.

Danach den iobroker wieder mit start starten und mit iobroker status kontrollieren ob alles läuft:

Im Redis Client kann man mit “keys *” sich auch alle Keys auflisten lassen die es gibt. Bei mir etwas über 150.000 – das ist schon Heftig

Endresultat

Was hat´s nun gebracht?

Die Schreibvorgänge sind erstmal massiv weniger geworden – Ziel erreicht. Aber auch die CPU Last hat sich gebessert:

Der Disk IO ist fast auf 0, dafür mehr Net IO und RAM Auslastung ist auch etwas gesunken am ioBroker.

Auf dem VM Host sieht man “etwas” weniger CPU – aber der redis benötigt natürlich auch etwas CPU Leistung. Aber dadurch, dass die Schreibvorgänge auf die NVME nun drastich weniger sind ist das Ziel erreicht.

Fazit

Ich denke mal, dass auch viele Raspberry Pi Besitzer auf redis als Backend umschalten sollten um die SD Karte zu entlasten. In meinem Beispiel wurden im Monat Mai 10TB an Daten geschrieben – sicher nicht alles der ioBroker aber ganz bestimmt ein Großteil.

Hinweise / Links:

Die mobile Version verlassen