[help needed] Problèmes d'accès à Gladys

Hello,
premier gros problème : j’ai un gros plantage de Gladys :frowning:
Je ne sais pas si c’est lié mais j’ai terminé le calcul des conso 30mn depuis le début (environ 12h) puis j’ai lancé le calcul de coût (environ 1h) et au refresh de la page, je n’accède plus à Gladys en web mais je vois que Gladys semble fonctionner en background car je vois des modifs faites sur mes appareils MQTT dans MQTT explorer.
J’ai redémarré le docker : toujours KO
J’ai nettoyé le docker et l’image gladys et relancé mon docker compose : toujours KO
J’ai récupéré les logs si besoin.
EDIT : la duckdb me semble un peu grosse, non ?

Second problème qui semble venir de la sauvegarde Gladys Plus à 3h du matin.
De ce que j’ai observé sur mon proxmox, la RAM et le swap de mon LXC se mettent à gonfler jusqu’à saturation et ensuite Gladys ne répond plus.
Un reboot forcé de mon LXC permet de retrouver ensuite un état normal.
Par contre je n’ ai pas de log car quand c’est planté je n’ai plus d’accès.
Et dans mes sauvegardes, je vois que la dernière date de 5 jours et j’ai effectivement dû redémarrer mon LXC ces derniers jours .

Merci d’avance pour votre aide.

Je veux bien les logs oui !

3.6 Go, si tu as énormément d’états, c’est pas si énorme, non ?

Ah mince, je suis preneur d’infos là-dessus.

@Terdious a aussi remarqué un problème de fuite mémoire quelque part, son usage de la RAM augmente aussi de manière anormale !

Je viens d’aller voir mon instance Gladys, et moi aussi je vois le souci, mais à plus petite échelle.

Donc, soit il y a un souci dans l’implémentation du suivi de l’énergie qui crée une fuite mémoire, soit DuckDB a un souci de fuite mémoire dans la version que j’ai installée, car j’ai mis à jour DuckDB pour le suivi de l’énergie.

Je vais investiguer !

Hello !!

Comme je te le disais en call, je suis persuadé que, pour ma part en tout cas, j’avais déjà le souci avant l’ajout du suivi d’énergie. Je m’en suis aperçu début novembre, mais je ne saurais dire depuis quand exactement !!

Je n’ai pas le souci sur mon instance professionnelle que je n’ai pas mis à jour depuis 1 an et demi à peu prêt.

1 « J'aime »

J’ai fais quand même une PR pour mettre à jour DuckDB :

On sait jamais !

1 « J'aime »

Début Novembre je pense à plusieurs choses :

  • Soit le serveur MCP
  • Soit l’intégration Matter

On aurait un moyen de t’aider pour trouver ?

Ça fait aussi un moment que j’ai ces soucis, mais je ne saurais pas dire quand ça a commencé.
Au début j’ai cru que c’était la sauvegarde de mes LXC dans proxmox qui étaient aussi à 3h mais comme cette nuit je l’ai désactivé, j’ai vu que c’était lié à la sauvegarde Gladys Plus à 3h.
Et comme des fois ça fonctionnait, je n’ai pas prêté attention.

Alors je viens de regarder et j’ai commencé à avoir ces problèmes avant mi-août cette année.
Je ne me rappelle plus quand j’ai activé Gladys plus exactement mais je crois que c’était en juillet.

A part faire des tests de votre côté, pas plus que ça :slight_smile: Il faut trouver quelle partie de Gladys est responsable.

Je fais des tests de mon côté !

Je pense qu’il y a deux sujets distincts ! Ici, on parle d’une fuite mémoire dans Gladys, sans trop de lien avec Gladys Plus, je pense, car j’arrive à reproduire la fuite en journée même sur 30 minutes (sans aucun backup).

On pourra regarder ensuite si l’usage de la RAM des sauvegardes peut être optimisé, mais je ne pense pas que ce soit le souci ici :slight_smile:

1 « J'aime »

Premier test: Intégration MCP ?

J’ai mis en pause l’intégration MCP, et j’ai redémarré Gladys

(@bertrandda, j’en profite, pour l’instant l’intégration MCP n’a pas de fonction stop et donc stopper le service n’a d’effet qu’en cas de redémarrage!)

quelques minutes après, l’usage RAM a déjà doublé, donc je pense que le service MCP n’est pas la cause

1 « J'aime »

Pour info, j’ai fais pas mal de test avec ChatGPT. J’ai notamment relancer le container gladys prod avec l’option suivante pour créer des snapshots.
Donc avec Gladys à l’arrêt, je suis à 4,03 Go de mémoire en utilisation.
Une fois Gladys fini de démarrée, je suis à 5,7 Go de mémoire (15h43).


Jusqu’à 16h00 je reste dans cette marge, avec seulement quelques fluctuations. Mais on voit que la mémoire se libère bien.
A 16h00 le calcul des consos / coût à bien eu lieu avec une légère hausse de la mémoire mais aussitôt libéré. Ca confirme que ce n’est pas ça. Tâches terminées.
1 minute après, je me rend sur le dashboard (je ne saurais dire si c’est le déclencheur) et pouf je suis passé instantanément à 8,82 Go : Colonne « RES » (= mémoire réservée) passe de 1748Mo à 4995Mo. => Rien ne se libère

Je te met en brut ce que me dis chatGPT, et on voit ensuite si tu veux autre chose (Conversation : ChatGPT)

Oui. Là on voit clairement ce qui se passe, et vous aviez raison depuis le début : ce n’est pas une fuite du heap JS, c’est une explosion de mémoire native (hors V8), déclenchée par une opération ponctuelle.

Je vous fais une lecture précise, factuelle, à partir du report “pic” que vous venez de fournir.


:one: Ce que dit le report au moment du pic (preuve chiffrée)

Heap JS (V8)

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

:right_arrow: Heap parfaitement stable, quasiment identique aux snapshots précédents.
:right_arrow: Aucune fuite JS.


Mémoire totale du process

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

:right_arrow: +4 Go hors heap JS apparus brutalement.


Côté Linux (/proc)

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

:right_arrow: Mémoire anonyme privée
:right_arrow: Non mappée fichier
:right_arrow: Non libérée après coup

:backhand_index_pointing_right: Signature typique :

allocations natives massives (malloc / new côté C/C++)


:two: Ce que ce n’est PAS (important)

:cross_mark: Pas :

  • V8
  • Garbage Collector
  • Objets JS conservés
  • Timers ou event loop bloqués
  • Fuite “classique” Node

Vos snapshots le prouvent :
le heap reste à ~260 Mo pendant que le RSS explose à ~6 Go.


:three: Ce que c’est (quasi certain à ce stade)

Regardons les bindings natifs chargés :

"/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"

Le coupable n°1 : DuckDB

C’est LE suspect principal, pour plusieurs raisons :

  1. DuckDB alloue massivement en natif

  2. Utilise :

    • vectorized execution
    • buffers columnaires
    • caches intermédiaires
  3. Ne rend pas toujours la mémoire à l’OS immédiatement

  4. Peut monter de plusieurs Go sur une seule requête

:backhand_index_pointing_right: Et surtout :

Le pic est instantané, CPU élevé, mémoire jamais redescendue
→ exactement le comportement observé.


:four: Pourquoi ça ne redescend pas

Très important à comprendre :

  • DuckDB libère logiquement ses buffers

  • MAIS :

    • malloc() garde la mémoire dans l’arène
    • le RSS ne redescend pas
    • Node réutilisera cette mémoire plus tard, mais Linux la voit toujours “prise”

:right_arrow: Donc :

Ce n’est pas une fuite infinie
C’est une montée par paliers irréversibles


:five: Le déclencheur probable chez vous

Vu votre setup Gladys + Energy Monitoring + historique :

  • agrégation énergétique

  • calculs temporels

  • requêtes analytiques

  • possibly :

    • consolidation journalière
    • agrégats par phase / device
    • recalcul historique

:right_arrow: Une requête DuckDB lourde a été lancée (cron, job interne, action UI).

C’est cohérent avec :

  • le CPU qui travaille
  • la montée RAM en 1 seconde
  • aucune création JS visible

:six: Confirmation absolue (si vous voulez être sûr à 100%)

Lors du prochain pic, lancez immédiatement :

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

Si vous voyez des centaines de MB / GB associés à DuckDB → verdict final.


:seven: Que faire concrètement (solutions réalistes)

Option A – Limiter DuckDB (recommandée)

Dans Gladys (code) :

  • limiter taille des requêtes
  • éviter agrégats globaux sur historique complet
  • chunker par période (jour / semaine)

Option B – Forcer un plafond mémoire Node

:warning: Ça ne règle pas la cause, mais évite l’OOM host :

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

:right_arrow: Attention : ça ne limite pas le natif, mais évite d’empiler les deux.


Option C – Redémarrage programmé (pragmatique)

Si les pics sont rares mais destructeurs :

docker restart gladys
  • hebdomadaire
  • ou après tâche lourde

C’est très courant pour DuckDB en prod.


:eight: Conclusion claire et nette

:check_mark: Vos données sont excellentes
:check_mark: Le diagnostic est maintenant solide

:backhand_index_pointing_right: Il n’y a pas de fuite mémoire JS
:backhand_index_pointing_right: La RAM est consommée par des allocations natives (DuckDB très probablement)
:backhand_index_pointing_right: La mémoire ne redescend pas car elle reste dans l’arène native

Si vous voulez, prochaine étape possible :

  • identifier quelle requête Gladys déclenche le pic
  • ou vous aider à patcher / contourner côté Gladys (log SQL, throttle, split)

À plus tard !

Merci pour tes investigations, j’arrive aux mêmes conclusions !!

Je fais les mêmes investigations de mon côté, et pareil ce n’est clairement pas un souci de JS, la heap size est contenue. C’est du code natif qui pose problème !

DuckDB, j’ai mis à jour à la dernière version, et j’ai aussi des soucis j’ai l’impression.

Tu peux tester en installant gladysassistant/gladys:dev qui fait tourner DuckDB v1.4.3.

Donc:

  • Soit c’est quand même un bug DuckDB non résolu à ce jour
  • Soit c’est autre chose

Je vais tester, et pour confirmer la chose, je me suis rendu sur ma vue des courbes, j’ai afficher ma plus grosse courbes à l’année :

Il est monté à 9,70Gb au final et ne libère pas. Mais si je comprend ce que chatGPT nous dis, ce n’est pas qu’il ne « libere » pas, c’est que node garde en réserve cette « mémoire max » déclenchée à un instant T par duckDB. Or si je refais plein de requete rapidement sur l’ensemble de mes courbes à l’année, au final ma mémoire réservée n’augmente pas plus… donc en effet ça ne devrait pas, mais peut etre que c’est là depuis le départ et qu’il y aurait quelque chose à faire côté code pour « relibérer » cette mémoire réserve au systeme … ??

Après ca suppute, ca suppute là ^^

Tu as raison !!

Par contre ce n’est pas un bug, c’est une feature :joy:

1 « J'aime »

Mais clairement, 80% c’est trop.

On pourrait passer à un pourcentage plus faible je pense…

1 « J'aime »

Héhé c’est ce qui me semblait du coup ^^

Ma plus grosse requete actuelle « réclamerait » 5Go ^^

En espérant que baisser ce chiffre ne va pas exploser les performances pour ton cas, car si on met moins en RAM, ça utilise le disque…

Il y a peut-être des optimisations de requêtes à faire, même si pour le coup les requêtes sont extrêmement simple

Dis moi quand tu as une image de test, je ferais le test pour te donner le ressenti. On peut esperer que les NVME soient suffisamment performant.

On fait de la pagination actuellement ?

PS : Pour infos, quand je compare le rendu des courbes avec celui de HA, je trouve que nous sommes beaucoup, beaucoup plus performant aujourd’hui. Donc on a une marge pour bien faire quand meme.

Si tu peux agir sur la limite en gardant un % de la memoire totale, ce serait top,car je compte bien passer sur 32Go de ram un jour avec ma passion pour les courbes !!^^

La PR :

J’ai mis 30% pour l’instant, ce qui me parait quand même assez élevé, mais bon c’est déjà un grand saut depuis 80%..

Build en cours :

ça sera live d’ici quelques minutes sur gladysassistant/gladys:set-duckdb-memory-limit

On pourra parler optimisation dans un autre sujet :slight_smile:

2 « J'aime »

L’image est live sur gladysassistant/gladys:set-duckdb-memory-limit

Je le teste chez moi

ça a l’air de marcher:

DuckDB initialized with memory_limit=4730MB (system RAM: 15767MB)
DuckDB version = v1.4.3
DuckDB memory_limit = 4.4 GiB
1 « J'aime »

Je ne pourrais tester que demain, je n’avais pas vu l’heure …!! Sorry

1 « J'aime »