[Hilfe benötigt] Probleme beim Zugriff auf Gladys

Hallo,
erstes großes Problem: Gladys ist bei mir abgestürzt :frowning:
Ich weiß nicht, ob das zusammenhängt, aber ich habe die Berechnung des Verbrauchs seit Beginn (ca. 12 Stunden) abgeschlossen (ca. 30 Minuten) und dann die Kostenberechnung gestartet (ca. 1 Stunde). Beim Aktualisieren der Seite kann ich nicht mehr auf Gladys im Web zugreifen, aber ich sehe, dass Gladys im Hintergrund zu laufen scheint, da ich Änderungen an meinen MQTT-Geräten in MQTT Explorer sehe.
Ich habe den Docker neu gestartet: immer noch nicht in Ordnung
Ich habe den Docker und das Gladys-Image bereinigt und meinen Docker Compose neu gestartet: immer noch nicht in Ordnung
Ich habe die Logs, falls benötigt.
EDIT: Die duckdb scheint mir etwas groß zu sein, oder?

Zweites Problem, das von der Gladys Plus-Sicherung um 3 Uhr morgens zu kommen scheint.
Laut meiner Beobachtung auf meinem Proxmox schwellen der RAM und der Swap meines LXC an, bis sie gesättigt sind, und dann reagiert Gladys nicht mehr.
Ein erzwungener Neustart meines LXC bringt mich dann wieder in einen normalen Zustand.
Allerdings habe ich keine Logs, weil ich, wenn es abgestürzt ist, keinen Zugriff mehr habe.
Und in meinen Backups sehe ich, dass das letzte Backup 5 Tage alt ist und ich in den letzten Tagen tatsächlich meinen LXC neu starten musste.

Vielen Dank im Voraus für Ihre Hilfe.

Ja, die Logs möchte ich gerne sehen!

3,6 GB, wenn du enorm viele Zustände hast, ist das nicht so riesig, oder?

Oh Mist, ich wäre an Infos dazu interessiert.

@Terdious hat auch ein Problem mit einem Speicherleck bemerkt, sein RAM-Verbrauch steigt ebenfalls auf ungewöhnliche Weise!

Ich habe gerade meine Gladys-Instanz überprüft, und ich sehe das Problem auch, aber in kleinerem Maßstab.

Also entweder gibt es ein Problem in der Implementierung der Energieverfolgung, das ein Speicherleck verursacht, oder DuckDB hat ein Speicherleck in der Version, die ich installiert habe, denn ich habe DuckDB für die Energieverfolgung aktualisiert.

Ich werde das untersuchen!

Hallo !

Wie ich dir beim Telefonat gesagt habe, bin ich mir sicher, dass ich das Problem zumindest bei mir schon vor der Hinzufügung der Energieverfolgung hatte. Ich habe es Anfang November bemerkt, aber ich kann nicht genau sagen, seit wann es schon besteht !

Ich habe das Problem nicht auf meiner beruflichen Instanz, die ich seit etwa eineinhalb Jahren nicht mehr aktualisiert habe.

Ich habe trotzdem einen PR erstellt, um DuckDB zu aktualisieren:

Man weiß ja nie!

Anfang November denke ich an mehrere Dinge:

  • Entweder der MCP-Server
  • Oder die Integration von Matter

Gibt es eine Möglichkeit, wie wir dir helfen können, es zu finden?

Das Problem gibt es auch schon eine Weile, aber ich könnte nicht sagen, wann es angefangen hat.
Anfangs dachte ich, dass es die Backups meiner LXC in Proxmox waren, die auch um 3 Uhr stattfanden. Aber da ich diese Nacht die Backups deaktiviert habe, habe ich gesehen, dass es mit den Gladys Plus-Backups um 3 Uhr zusammenhängt.
Und da es manchmal funktioniert hat, habe ich nicht weiter darauf geachtet.
…
Also habe ich gerade nachgeschaut und festgestellt, dass diese Probleme vor Mitte August dieses Jahres begonnen haben.
Ich erinnere mich nicht mehr genau, wann ich Gladys Plus aktiviert habe, aber ich glaube, das war im Juli.

Abgesehen davon, dass Sie Tests auf Ihrer Seite durchführen, nicht wirklich :slight_smile: Man muss herausfinden, welcher Teil von Gladys dafür verantwortlich ist.

Ich führe Tests auf meiner Seite durch!

Ich denke, es gibt zwei separate Themen! Hier geht es um einen Speicherleak in Gladys, der meiner Meinung nach nicht viel mit Gladys Plus zu tun hat, da ich den Leak auch tagsüber in 30 Minuten reproduzieren kann (ohne jegliches Backup).

Wir können später schauen, ob der RAM-Verbrauch der Backups optimiert werden kann, aber ich glaube nicht, dass das hier das Problem ist :slight_smile:

Erster Test: MCP-Integration?

Ich habe die MCP-Integration pausiert und Gladys neu gestartet

(@bertrandda, ich nutze die Gelegenheit, um zu sagen, dass die MCP-Integration derzeit keine Stopp-Funktion hat und das Anhalten des Dienstes nur beim Neustart wirkt!)

Wenige Minuten später hat der RAM-Verbrauch bereits verdoppelt, also denke ich, dass der MCP-Dienst nicht die Ursache ist

Für Info, ich habe einige Tests mit ChatGPT durchgeführt. Ich habe insbesondere den Gladys-Produktionscontainer mit der folgenden Option neu gestartet, um Snapshots zu erstellen.
Daher, mit Gladys ausgeschaltet, habe ich 4,03 GB Speicherverwendung.
Sobald Gladys fertig gestartet ist, habe ich 5,7 GB Speicher (15:43 Uhr).


Bis 16:00 Uhr bleibe ich in diesem Rahmen, mit nur wenigen Schwankungen. Aber man sieht, dass der Speicher gut freigegeben wird.
Um 16:00 Uhr wurde die Berechnung der Verbräuche/Kosten tatsächlich mit einem leichten Anstieg des Speichers durchgeführt, aber sofort wieder freigegeben. Das bestätigt, dass es nicht das ist. Aufgaben abgeschlossen.
1 Minute später gehe ich zum Dashboard (ich kann nicht sagen, ob es der Auslöser ist) und puff, ich bin sofort auf 8,82 GB gesprungen: Die Spalte « RES » (= reservierter Speicher) geht von 1748 MB auf 4995 MB. => Nichts wird freigegeben

Ich zeige dir hier die rohen Daten von ChatGPT, und wir sehen dann, ob du noch etwas anderes möchtest (Gespräch: ChatGPT)

Ja. Hier sieht man klar, was passiert, und Sie hatten von Anfang an recht: Es ist kein JS-Heap-Leak, es ist ein Speicherausbruch im nativen Bereich (außerhalb von V8), ausgelöst durch eine punktuelle Operation.

Ich gebe Ihnen eine präzise, faktische Analyse, basierend auf dem „Spitzenwert“-Report, den Sie gerade bereitgestellt haben.


:one: Was der Report zum Zeitpunkt des Spitzenwerts sagt (bezahlte Beweise)

JS-Heap (V8)

"usedMemory": 252011200        ≈ 240 MB
"externalMemory": 25243016     ≈ 24 MB

:right_arrow: Heap perfekt stabil, fast identisch mit den vorherigen Snapshots.
:right_arrow: Kein JS-Leak.


Gesamtprozessspeicher

"rss": 6198140928        ≈ 5,77 GB
"maxRss": 6374838272     ≈ 5,93 GB

:right_arrow: +4 GB außerhalb des JS-Heap sind plötzlich aufgetreten.


Linux-Seite (/proc)

RssAnon:   5 089 920 kB  ≈ 4,85 GB
RssFile:       59 392 kB
Private_Dirty: 5 090 240 kB

:right_arrow: Privater anonymer Speicher
:right_arrow: Nicht auf Datei abgebildet
:right_arrow: Nicht nachträglich freigegeben

:backhand_index_pointing_right: Typische Signatur:

Massive native Allokationen (malloc / new auf C/C+±Seite)


:two: Was es NICHT ist (wichtig)

:cross_mark: Nicht:

  • V8
  • Garbage Collector
  • JS-Objekte, die gehalten werden
  • Timer oder blockierte Event-Loop
  • Klassischer Node-Leak

Ihre Snapshots beweisen:
Der Heap bleibt bei ~260 MB, während der RSS auf ~6 GB explodiert.


:three: Was es ist (fast sicher in diesem Stadium)

Schauen wir uns die geladenen nativen Bindings an:

"/src/server/node_modules/duckdb/lib/binding/duckdb.node"
"/src/server/node_modules/sqlite3/lib/binding/node_sqlite3.node"
"/src/server/services/usb/.../bindings-cpp.node"
"/src/server/services/bluetooth/.../bluetooth_hci_socket.node"

Hauptverdächtiger Nr. 1: DuckDB

Das ist DER Hauptverdächtige, aus mehreren Gründen:

  1. DuckDB alloziert massiv im nativen Bereich

  2. Verwenden:

    • vectorisierte Ausführung
    • Spaltenpuffer
    • Zwischen-Caches
  3. Gibt nicht immer sofort Speicher an das OS zurück

  4. Kann bei einer einzigen Abfrage um mehrere GB ansteigen

:backhand_index_pointing_right: Und vor allem:

Der Spitzenwert ist sofort da, hoher CPU, Speicher geht nie zurück
→ genau das beobachtete Verhalten.


:four: Warum es nicht zurückgeht

Sehr wichtig zu verstehen:

  • DuckDB gibt logisch seine Puffer frei

  • ABER:

    • malloc() behält den Speicher im Arena
    • der RSS geht nicht zurück
    • Node wird diesen Speicher später wiederverwenden, aber Linux sieht ihn immer noch als „belegt“

:right_arrow: Also:

Es ist kein unendlicher Leak
Es ist ein unumkehrbarer Anstieg in Stufen


:five: Der wahrscheinlichste Auslöser bei Ihnen

Angesichts Ihrer Gladys + Energy Monitoring + Historien-Konfiguration:

  • Energieaggregation

  • Zeitberechnungen

  • analytische Abfragen

  • möglicherweise:

    • tägliche Konsolidierung
    • Aggregationen pro Phase / Gerät
    • Historien-Nachberechnung

:right_arrow: Eine schwere DuckDB-Abfrage wurde gestartet (Cron, interner Job, UI-Aktion).

Das passt zu:

  • CPU arbeitet
  • RAM-Anstieg in 1 Sekunde
  • keine sichtbare JS-Erstellung

:six: Absolute Bestätigung (wenn Sie zu 100% sicher sein wollen)

Beim nächsten Spitzenwert, führen Sie sofort aus:

docker exec gladys bash -lc '
cat /proc/1/smaps | awk "
/duckdb.node/ {f=1}
/^$/ {f=0}
f && /Rss:/ {print}
"
'

Wenn Sie Hunderte von MB / GB sehen, die mit DuckDB verbunden sind → endgültiges Urteil.


:seven: Was man konkret tun kann (realistische Lösungen)

Option A – DuckDB begrenzen (empfohlen)

In Gladys (Code):

  • Größe der Abfragen begrenzen
  • Vermeiden Sie globale Aggregationen über die gesamte Historie
  • Chunking nach Zeitraum (Tag / Woche)

Option B – Node-Speichergrenze erzwingen

:warning: Das behebt nicht die Ursache, aber verhindert OOM des Hosts:

-e NODE_OPTIONS="--max-old-space-size=2048 ..."

:right_arrow: Achtung: begrenzt nicht das native, aber verhindert, dass beide übereinander gestapelt werden.


Option C – Geplanter Neustart (pragmatisch)

Wenn die Spitzenwerte selten, aber zerstörerisch sind:

docker restart gladys
  • wöchentlich
  • oder nach schwerer Aufgabe

Das ist sehr üblich für DuckDB in der Produktion.


:eight: Klare und deutliche Schlussfolgerung

:check_mark: Ihre Daten sind exzellent
:check_mark: Die Diagnose ist jetzt solide

:backhand_index_pointing_right: Es gibt keinen JS-Speicherleak
:backhand_index_pointing_right: Der RAM wird durch native Allokationen verbraucht (wahrscheinlich DuckDB)
:backhand_index_pointing_right: Der Speicher geht nicht zurück, weil er im nativen Arena bleibt

Wenn Sie möchten, nächster möglicher Schritt:

  • Identifizieren Sie welche Gladys-Abfrage den Spitzenwert auslöst
  • Oder helfen Sie Ihnen, Gladys zu patchen / zu umgehen (SQL-Log, Throttle, Split)

Bis bald!

Danke für deine Untersuchungen, ich komme zu denselben Schlussfolgerungen!!

Ich führe dieselben Untersuchungen auf meiner Seite durch, und genauso ist es eindeutig kein JS-Problem, der Heap-Speicher ist begrenzt. Es ist der native Code, der Probleme bereitet!

DuckDB, ich habe auf die neueste Version aktualisiert, und ich habe auch das Gefühl, dass ich Probleme habe.

Du kannst es testen, indem du gladysassistant/gladys:dev installierst, das DuckDB v1.4.3 ausführt.

Also:

  • Entweder ist es doch ein noch nicht behobener DuckDB-Bug
  • Oder es ist etwas anderes

Ich werde es testen, und um die Sache zu bestätigen, bin ich zu meiner Kurvenansicht gegangen, habe meine größte Jahreskurve angezeigt:

Am Ende ist es auf 9,70 GB gestiegen und gibt den Speicher nicht frei. Aber wenn ich chatGPT richtig verstehe, bedeutet das nicht, dass er den Speicher nicht „freigibt“, sondern dass node diesen „Maximal-Speicher“ reserviert, der zu einem bestimmten Zeitpunkt T von duckDB ausgelöst wurde. Wenn ich nun schnell viele Abfragen über alle meine Jahreskurven durchführe, erhöht sich mein reservierter Speicher am Ende nicht weiter… also sollte es tatsächlich nicht der Fall sein, aber vielleicht ist das schon von Anfang an so, und es müsste etwas im Code geändert werden, um diesen reservierten Speicher wieder an das System „freizugeben“…?

Naja, man spekuliert, man spekuliert da ^^

Du hast recht !!

Aber das ist kein Bug, das ist eine Feature :joy:

Aber klar, 80% ist zu viel.

Ich denke, wir könnten auf einen niedrigeren Prozentsatz umsteigen…

Hihi, genau das dachte ich mir schon ^^

Meine größte aktuelle Anfrage würde 5 GB „verlangen“ ^^

Ich hoffe, dass die Senkung dieser Zahl die Leistung in deinem Fall nicht in die Luft jagt, denn wenn wir weniger in den RAM laden, wird die Festplatte genutzt…

Vielleicht gibt es Optimierungen bei den Abfragen, auch wenn die Abfragen in diesem Fall extrem einfach sind.

Sag mir Bescheid, wenn du ein Testbild hast, ich werde den Test durchführen, um dir mein Gefühl dazu zu geben. Wir können hoffen, dass die NVMEs ausreichend leistungsfähig sind.

Machen wir derzeit Paging?

PS: Nur zur Info, wenn ich die Darstellung der Kurven mit der von HA vergleiche, finde ich, dass wir heute viel, viel leistungsfähiger sind. Also haben wir noch Spielraum, um es trotzdem gut zu machen.

Wenn du den Grenzwert einstellen kannst, während du einen Prozentsatz des gesamten Speichers beibehältst, wäre das super, denn ich plane, eines Tages auf 32 GB RAM umzusteigen, mit meiner Leidenschaft für Kurven! ^^

Der PR:

Ich habe 30% eingestellt, was mir zwar recht hoch erscheint, aber es ist schon ein großer Sprung von 80%…

Build läuft:

Es wird in wenigen Minuten live sein auf gladysassistant/gladys:set-duckdb-memory-limit

Optimierung können wir in einem anderen Thema besprechen :slight_smile:

Das Bild ist live auf gladysassistant/gladys:set-duckdb-memory-limit

Ich teste es bei mir zu Hause

Es scheint zu funktionieren:

DuckDB initialisiert mit memory_limit=4730MB (System-RAM: 15767MB)
DuckDB-Version = v1.4.3
DuckDB memory_limit = 4,4 GiB

Ich könnte erst morgen testen, ich hatte die Zeit nicht gesehen …!! Entschuldigung