Ja, ich habe festgestellt, dass die Datenbank sonst beschädigt wird.
Ja, ich bestätige dir, dass es seit über 12 Stunden läuft, für die Löschung einer einzigen Funktion. Aber ich weiß, dass das mit zwei Dingen zusammenhängt: einer 8-GB-Datenbank und einem RPi mit einer SD-Karte und keinem SSD.
Falls du es zur Hand hast, kannst du mir bitte sagen, wie ich:
Features nach Geräten auflisten
Daten einer Funktion löschen (und ich würde anschließend deren Speicherung in der Oberfläche deaktivieren)
Danach, um die Zustände einer Funktion zu löschen:
DELETE FROM t_device_feature_state WHERE device_feature_id = 'cca3209-8d8f-4965-b658-bdb28eb31300';
DELETE FROM t_device_feature_state_aggregate WHERE device_feature_id = 'cca3209-8d8f-4965-b658-bdb28eb31300';
Ok, 60.000 Zeilen sind doch nichts Wir können später eine Aufgabe einrichten, um den Verlauf zu leeren (ein bisschen wie bei den States: letzte 6 Monate, letztes Jahr, etc.)
Super, die Datenbank wurde auch bei mir reduziert und das merkt man bei der Anzeige der Diagramme.
Allerdings habe ich jetzt ein Problem bei jeder Änderung eines Geräts, zum Beispiel seines Namens, wodurch Gladys für mehrere Minuten blockiert wird. (einfach 10 bis 15 Minuten)
Ist das normal?
Ich könnte mehr Details geben und Tests durchführen, aber abends, falls nötig.
Ich bestätige, dass ich denselben Fehler habe.
Wenn ich meine MQTT-Geräte ändere, dauert es jedes Mal sehr lange, bis eine Fehlermeldung angezeigt wird.
Ich muss die Gladys-Instanz neu starten, damit es wieder funktioniert, aber die Änderung wird übernommen.
@pierre-gilles ich weiß nicht, ob das der Fall ist, aber es sieht wirklich so aus, als ob entweder die Datenbank oder Gladys in diesem Moment im Blockiermodus ist.
Denn wirklich nichts reagiert mehr. Also entweder liege ich total falsch (das wäre nicht das erste Mal ), oder es gibt etwas zu tun, um diesen Teil etwas zu optimieren.
Auf meiner Seite sehe ich einen Prozess node index.js bei 100% der CPU, während das Schreiben auf die SD-Karte meines Raspberry Pi nicht bei 100% der I/O zu sein scheint.
Wenn ihr ein Gerät registriert, macht Gladys zwei Dinge:
Wenn bestimmte Features im Historienmodus deaktiviert sind, löscht Gladys alle Zustände dieser Features. Das kann potenziell Millionen von Zeilen in einigen Datenbanken bedeuten, was die DB während der Löschung für eine Weile blockieren kann.
Danach führt Gladys einen VACUUM aus, einen Vorgang, der die Daten « wirklich » vom Datenträger löscht und Speicherplatz freigibt. VACUUM ist ein blockierender Vorgang, und während des gesamten VACUUM ist die DB, und damit Gladys, nicht zugänglich. Bei kleinen DBs ist das nicht sichtbar, bei großen DBs kann es 20 Minuten dauern und man hat den Eindruck, dass es « kaputt » ist, obwohl es nur arbeitet!
Die Lösung, die ich sehe:
Eine Hintergrundaufgabe zum Löschen von Zuständen programmieren, die in kleinen Batches löscht, damit Gladys nicht blockiert wird, wenn Features mit Millionen von Zuständen gelöscht werden. Es müssen Tests durchgeführt und die richtige Zahl gefunden werden, damit es weder zu blockierend noch zu langsam ist.
Den sofortigen VACUUM entfernen und eine geplante nächtliche VACUUM-Aufgabe einrichten, die aktiviert/deaktiviert werden kann (z. B. alle zwei Wochen).
Der Nachteil all dessen ist, dass die « Speicherplatzfreigabe » nicht mehr sofort erfolgt. Nach einer Zustandslöschung muss man bis zur nächsten Nacht oder bis zu einer Woche warten, bis Gladys sich selbst löscht. Eventuell kann man irgendwo einen Knopf einrichten, um manuell zu löschen, aber der Benutzer muss sich bewusst sein, dass Gladys während der gesamten Löschzeit nicht verfügbar ist.
Ich habe aber eine ziemlich volle Woche, also denke ich nicht, dass ich in den nächsten Tagen einen Blick darauf werfen kann. Ich werde es entweder am Wochenende oder im Laufe der nächsten Woche tun! Ich halte euch auf dem Laufenden
Aber 20 Minuten für eine kleine Namensänderung zum Beispiel ist sehr lang. Das ist sehr blockierend, sogar etwas ärgerlich, auch wenn wir wissen, dass Gladys nicht kaputt ist und im Hintergrund arbeitet.
Meiner Meinung nach kann die Reinigung später erfolgen, wie du vorschlägst. Und vom Benutzer aktivierbar/deaktivierbar wäre gut.
Danke für die Details, jetzt verstehe ich besser, warum wir alle das Gefühl haben, dass es blockiert.
Ich bin für die Lösung mit dem VACUUM nachts (z. B. zwischen 2 und 4 Uhr morgens).
Welcher Nutzer wird sich wirklich um die Größe seiner DB kümmern, wenn es nur ein paar Stunden später ist?