Leistungsproblem im Dashboard mit vielen Grafiken

Edit: Ich habe den Titel dieser Nachricht geändert, da es sich am Ende um ein spezifisches Leistungsproblem von Gladys handelte.

Hallo :slight_smile:

Es handelt sich nicht wirklich um eine eigentliche Smart-Home-Funktion und es ist etwas, das eine große Entwicklung erfordert ^^

Aber ich denke, es wäre nützlich, bei der Installation von Gladys die Wahl zwischen einer SQLite- oder MySQL-Datenbank zu haben.

Warum dieser Bedarf?
Wenn man viele Module auf einem Dashboard hat, insbesondere Grafiken, zeigt SQLite seine Grenzen (etwa 10 Sekunden, um mein Haupt-Dashboard anzuzeigen).

Eine MySQL-Datenbank würde Gladys bei mehreren parallelen Abfragen leistungsfähiger machen und die Flüssigkeit der Dashboards verbessern.

Es handelt sich hier nur um meine Meinung ^^

Meine Meinung: Wenn du mich bei der Installation zur Auswahl aufforderst, installiere ich nicht, weil ich es nicht verstehe und denke, dass es nichts für mich ist :innocent:
Aber ich nehme an, die technische Entscheidung, die getroffen wurde, ist/war gut durchdacht (und kann sicherlich bei Bedarf weiterentwickelt werden :wink: )

Ich stimme tatsächlich zu, dass eine solche Wahl einen großen Teil der Benutzer verlieren würde und dass SQLite für die große Mehrheit der Installationen ausreicht.

Dieser Wahl könnte sich beispielsweise in einem Reiter „Erweiterte Einstellungen“ befinden, der dann funktionsfähig wäre.

Aber es ist sicherlich eine große Entwicklung für, wie ich denke, eine Minderheit der Benutzer.

Hallo @Checconio!

Ich glaube nicht, dass MySQL die Lösung für dein Problem ist. SQLite ist für diesen Zweck genauso leistungsfähig, nur weil „Lite“ im Namen steht, heißt das nicht, dass es langsamer ist, im Gegenteil :smiley:

Das Problem mit der Performance sollte eher in Gladys gelöst werden :slight_smile:

Würde es dich stören, mir deine Datenbank (privat) zur Verfügung zu stellen, damit ich auf meiner Seite Performance-Tests durchführen kann?

Wie schnell ist deine Festplatte?

Um die Geschwindigkeit zu messen, empfehle ich dir, diesem Tutorial zu folgen => Your Web Host Doesn’t Want You To Read This: Benchmark Your VPS | LinuxBlog.io, mit dem Befehl dd kannst du die Schreib-/Leseleistung messen.

Danke für dein Feedback @pierre-gilles

Ich weiß, dass SQLite sehr leistungsfähig ist, aber jede Datenbankverwaltung hat ihre Vor- und Nachteile. Deshalb bleibt das Thema eine Vorschlag :slight_smile:
Du kennst dich am besten mit der Funktionsweise von Gladys und der Datenbank aus

Kein Problem, bei der Optimierung zu helfen!

Gladys läuft auf einer M2 SSD, Schreibgeschwindigkeit nach Benchmark: zwischen 350 und 380 MB/s
Prozessor: 2,7 GHz, 4 Kerne
RAM: 8 GB + 1 GB Swap

Ich schicke dir meine Datenbank privat.

Danke @Checconio für die DB, die du mir privat geschickt hast, ich konnte eine kleine Leistungsüberprüfung an deinen Daten durchführen und es hat mir sehr geholfen, ich habe das Problem gefunden! :slight_smile:

Zuerst war das Problem sehr klar, es war sogar auf meinem Entwicklungsrechner, der recht leistungsstark ist, extrem langsam, ich weiß nicht, wie du das aushältst, es war ultra langsam ^^

Um das zu veranschaulichen, sah ich das:

Fast 40 Sekunden, um die Seite anzuzeigen, das ist einfach enorm ^^

Ich habe Gladys lokal im Debug-Modus ausgeführt, um die ausgeführten SQL-Abfragen zu sehen, und ich habe sie manuell auf der DB, « live », ausgeführt.

6 Sekunden für eine Abfrage, die nichts zurückgibt, das ist viel!

Ich habe also den Faden aufgegriffen, es gibt 2 Bedingungen in dieser Abfrage (WHERE device_feature_id = ? AND created_at >= ?), und diese beiden Attribute haben tatsächlich einen Index…

Ich führe EXPLAIN QUERY PLAN aus, um zu verstehen, was SQLite tut, und ich verstehe.

SQLite konnte den Index auf device_feature_id verwenden, um alle Zustände dieser Funktion zu finden, aber dann führte es einen sequenziellen Scan durch, um nach Datum zu filtern: der Index auf dem Datum wurde nicht verwendet.

Die Lösung ist ganz einfach, es reicht, einen Index hinzuzufügen, der die 2 Attribute abdeckt, die bei der Abfrage verwendet werden.

Ich habe also 2 Indizes auf device_feature_state und t_device_feature_state_aggregate hinzugefügt, die die Attribute abdecken, die bei den Abfragen des Dashboards verwendet werden.

await queryInterface.addIndex('t_device_feature_state', ['device_feature_id', 'created_at']);
await queryInterface.addIndex('t_device_feature_state_aggregate', ['device_feature_id', 'type', 'created_at']);

Und dann: bam! Diese gleiche Abfrage geht von 6 Sekunden auf… 5ms !! :grimacing:

Auf der gesamten Seite gehen wir von 40 Sekunden auf.. 100 ms auf meinem Rechner!

Ich hatte es dir gesagt, es lag nicht an SQLite, wir hätten das gleiche Problem auf MySQL gehabt;)

Ich habe einen PR erstellt, der das Problem behebt, es wird in der nächsten Version von Gladys veröffentlicht:

@Terdious @lmilcent das wird euch interessieren, ihr, die ihr viele Daten habt!

Das ist super!

Und danke für die Erklärungen :smiley:
Diese große Optimierung wird es mir ermöglichen, meinen Gladys weiterhin richtig aufblähen zu können :wink:

Oh ja, ich kann es kaum erwarten, es zu testen und zu bestätigen, dass es bei mir alles verändert :slight_smile:

Pierre Gilles, erster Verteidiger von SQLite :shield: Danke für die Analyse und die Korrektur, sehr interessant.

Ich habe einen Build auf dem dev-Tag laufen, ich halte euch auf dem Laufenden, wenn es fertig ist :wink:

In unserem Anwendungsfall (Embedded-Programm) ist SQLite am besten geeignet, deshalb verteidige ich es :smiley: Client/Server-Datenbankmanagementsysteme (MySQL/PostgreSQL) sind geeignet, wenn man einen Datenbankserver hat, der von mehreren Clients im Netzwerk abgefragt wird.

Ich zitiere die SQLite-Website: Appropriate Uses For SQLite

Der Build ist fertig:

Nach 26 Minuten Update meiner Datenbank aufgrund deines Patches bestätige ich den enormen Geschwindigkeitszuwachs bei den Dashboards.

Ich kann alle Dashboards in einer Schleife fast sofort laden. Zuvor ließ ich Gladys 5 bis 10 Sekunden auf meinen Dashboards mit vielen Grafiken „abstürzen“.

Genial! Ja, es ist normal, dass die Migration Zeit in Anspruch nimmt, da der gesamte Index aufgebaut werden muss.

Deine Datenbank wird auch größer sein, normalerweise etwa +20%, aber das ist der Preis, den man zahlen muss, damit alles sofort angezeigt wird! :grinning_face_with_smiling_eyes:

Oh ja, von 6,3 GB auf 7,9 GB :scream:

Ja, aber du kannst Features aus der Historie entfernen, das schafft ein bisschen Platz :grin:

Das ist klar.
Ich wage es noch nicht, es anzufassen. Hat das schon mal jemand gemacht?

Ich habe das in der Datenbank gemacht :smiling_face_with_sunglasses:

@euguuu hat es getestet und es funktioniert!

Der Bonus ist, dass Gladys jedes Mal, wenn du Features aus der Historie entfernst, ein kleines VACUUM laufen lässt, also macht es auch eine Reinigung :wink:

Wow, danke für den Link, das ist mir durchgerutscht. Ich kann es kaum erwarten, das auszuprobieren!!

@pierre-gilles, ich habe gestern Abend versucht, Gladys auf meinem Desktop-PC zu installieren, meine aktuelle Datenbank zu verwenden, um dann Features zu löschen.
Mein Desktop-PC verwendet eine NVMe-SSD, also sollte es super schnell sein, viel schneller als mein RPi, der 10 Stunden braucht, um die 8 GB meiner Datenbank zu verarbeiten und die Features zu löschen…

ABER, da der Zigbee2MQTT-Dienst verwendet werden muss und er nicht in der Entwicklerinstanz läuft, die ich auf meinem PC installiert habe, ist es unmöglich, auf die Geräte zuzugreifen, um die Features zu löschen.

→ Hast du einen Trick, damit ich die Features auf meinem Desktop-PC löschen und dann diese modifizierte Datenbankversion auf meinem RPi wiederverwenden kann?