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.
Interessant, dass du auf die Idee kommst, die Festplatten durch Redis etwas zu entlasten. Ich muss zugeben, dass ich diesen Aspekt bislang “ausgeblendet” habe oder vielleicht etwas blind war (trotz Informatik-Background).
Ich habe gerade mal bei mir auf dem Server nachgesehen und festgestellt, dass der Disk IO bei mir zwischen 0,5 und 1 MB liegt. Trotz vieler Skripte und gefühlt unzähligen Geräten.
Deine Möglichkeit mit Redis werde ich mir aber mal ansehen. Auch wenn bei mir der IO etwas niedriger liegt ist es immer gut, die Festplatten zu entlasten. Auch aufgrund der Geschwindigkeit.
Danke für die Inspiration! 🙂
Pingback: In ioBroker Redis nutzen - Alle Infos - Hobbyblogging
Pingback: Herausforderung Speicherverbrauch – Redis und ioBroker unter Proxmox | Mein Blog