[se necesita ayuda] Problemas de acceso a Gladys

Hola,
primer gran problema: tengo un gran fallo de Gladys :frowning:
No sé si está relacionado, pero terminé el cálculo de consumo hace 30 minutos desde el principio (aproximadamente 12 horas) y luego lancé el cálculo de coste (aproximadamente 1 hora) y al actualizar la página, ya no accedo a Gladys en la web, pero veo que Gladys parece funcionar en segundo plano porque veo cambios realizados en mis dispositivos MQTT en MQTT Explorer.
He reiniciado el docker: sigue sin funcionar
He limpiado el docker y la imagen gladys y he vuelto a lanzar mi docker compose: sigue sin funcionar
He recuperado los registros si es necesario.
EDIT: ¿no te parece que la duckdb es un poco grande, no?

Segundo problema que parece venir del backup de Gladys Plus a las 3 de la mañana.
De lo que he observado en mi proxmox, la RAM y el swap de mi LXC empiezan a aumentar hasta la saturación y luego Gladys ya no responde.
Un reinicio forzado de mi LXC permite volver a un estado normal.
Por otro lado, no tengo registros porque cuando se bloquea ya no tengo acceso.
Y en mis copias de seguridad, veo que la última data de hace 5 días y efectivamente he tenido que reiniciar mi LXC estos últimos días.

Gracias de antemano por su ayuda.

¡Me gustaría ver los registros, sí!

3.6 GB, si tienes muchos estados, no es tan enorme, ¿no?

Vaya, me interesa la información sobre eso.

@Terdious también ha notado un problema de fuga de memoria en algún lugar, ¡su uso de la RAM también aumenta de manera anormal!

Acabo de revisar mi instancia Gladys, y yo también veo el problema, pero a menor escala.

Por lo tanto, o hay un problema en la implementación del seguimiento de energía que causa una fuga de memoria, o DuckDB tiene un problema de fuga de memoria en la versión que he instalado, porque actualicé DuckDB para el seguimiento de energía.

¡Voy a investigar!

¡Hola!

Como te decía en la llamada, estoy convencido de que, al menos en mi caso, ya tenía el problema antes de añadir el seguimiento de energía. Me di cuenta a principios de noviembre, pero no sabría decir exactamente desde cuándo.

No tengo el problema en mi instancia profesional, que no he actualizado desde hace año y medio, más o menos.

He hecho un PR de todos modos para actualizar DuckDB:

¡Quién sabe!

A principios de noviembre pienso en varias cosas:

  • O bien el servidor MCP
  • O bien la integración Matter

¿Habría alguna forma de ayudarte a encontrar?

Llevo un tiempo con estos problemas, pero no sabría decir cuándo empezaron.
Al principio pensé que eran las copias de seguridad de mis LXC en Proxmox, que también estaban programadas a las 3 de la madrugada, pero como anoche las desactivé, vi que el problema estaba relacionado con la copia de seguridad de Gladys Plus a las 3 de la madrugada.
Y como a veces funcionaba, no le presté atención.
…
Así que acabo de mirar y empecé a tener estos problemas antes de mediados de agosto de este año.
No me acuerdo exactamente cuándo activé Gladys Plus, pero creo que fue en julio.

Además de hacer pruebas por tu parte, no hay más que eso :slight_smile: Hay que encontrar qué parte de Gladys es responsable.

¡Yo hago pruebas por mi parte!

Creo que hay dos temas distintos. Aquí hablamos de una fuga de memoria en Gladys, sin mucha relación con Gladys Plus, creo, porque puedo reproducir la fuga incluso durante el día en solo 30 minutos (sin ninguna copia de seguridad).

Podremos mirar después si el uso de la RAM de las copias de seguridad puede optimizarse, pero no creo que sea el problema aquí :slight_smile:

Prueba inicial: ¿Integración MCP?

He pausado la integración MCP y he reiniciado Gladys

(@bertrandda, aprovecho para decir que, por ahora, la integración MCP no tiene una función de parada y, por lo tanto, detener el servicio solo tiene efecto en caso de reinicio).

Unos minutos después, el uso de RAM ya se ha duplicado, por lo que creo que el servicio MCP no es la causa

Para información, he hecho muchas pruebas con ChatGPT. En particular, he relanzado el contenedor gladys prod con la siguiente opción para crear instantáneas.
Por lo tanto, con Gladys detenido, tengo 4,03 Go de memoria en uso.
Una vez que Gladys ha terminado de iniciarse, tengo 5,7 Go de memoria (15:43).


Hasta las 16:00 me mantengo dentro de este margen, con solo algunas fluctuaciones. Pero se puede ver que la memoria se libera bien.
A las 16:00 el cálculo de los consumos/coste se realizó correctamente con un ligero aumento de la memoria, pero inmediatamente liberado. Esto confirma que no es eso. Tareas terminadas.
1 minuto después, me dirijo al panel de control (no sabría decir si es el detonante) y de repente he pasado a 8,82 Go: la columna « RES » (= memoria reservada) pasa de 1748Mo a 4995Mo. => Nada se libera

Te pongo en bruto lo que me dice ChatGPT, y luego vemos si quieres algo más (Conversación: ChatGPT)

Sí. Ahora vemos claramente lo que está pasando, y tenías razón desde el principio: no es una fuga de heap JS, es una explosión de memoria nativa (fuera de V8), desencadenada por una operación puntual.

Te hago una lectura precisa, factual, a partir del informe “pic” que acabas de proporcionar.


:one: Lo que dice el informe en el momento del pico (prueba numérica)

Heap JS (V8)

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

:right_arrow: Heap perfectamente estable, casi idéntico a las instantáneas anteriores.
:right_arrow: Ninguna fuga JS.


Memoria total del proceso

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

:right_arrow: +4 Go fuera del heap JS aparecidos bruscamente.


Del lado de Linux (/proc)

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

:right_arrow: Memoria anónima privada
:right_arrow: No mapeada a archivo
:right_arrow: No liberada después

:backhand_index_pointing_right: Firma típica:

asignaciones nativas masivas (malloc / new del lado de C/C++)


:two: Lo que NO es (importante)

:cross_mark: No es:

  • V8
  • Recogedor de basura
  • Objetos JS conservados
  • Temporizadores o bucle de eventos bloqueados
  • Fuga “clásica” de Node

Tus instantáneas lo demuestran:
la pila se mantiene en ~260 Mo mientras que el RSS explota a ~6 Go.


:three: Lo que es (casi seguro en este punto)

Miremos los vínculos nativos cargados:

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

El principal sospechoso: DuckDB

Es EL principal sospechoso, por varias razones:

  1. DuckDB asigna masivamente en nativo

  2. Utiliza:

    • ejecución vectorizada
    • buffers columnares
    • caches intermedios
  3. No siempre devuelve la memoria al SO inmediatamente

  4. Puede subir varios Go en una sola consulta

:backhand_index_pointing_right: Y sobre todo:

El pico es instantáneo, CPU elevado, memoria nunca baja
→ exactamente el comportamiento observado.


:four: Por qué no baja

Muy importante de entender:

  • DuckDB libera lógicamente sus buffers

  • PERO:

    • malloc() mantiene la memoria en el área
    • el RSS no baja
    • Node reutilizará esta memoria más tarde, pero Linux la ve siempre “ocupada”

:right_arrow: Por lo tanto:

No es una fuga infinita
Es un aumento por escalones irreversibles


:five: El detonante probable en tu caso

Viendo tu configuración Gladys + Energy Monitoring + historial:

  • agregación energética

  • cálculos temporales

  • consultas analíticas

  • posiblemente:

    • consolidación diaria
    • agregados por fase / dispositivo
    • recálculo histórico

:right_arrow: Una consulta pesada de DuckDB se lanzó (cron, trabajo interno, acción UI).

Es coherente con:

  • el CPU trabajando
  • el aumento de RAM en 1 segundo
  • ninguna creación JS visible

:six: Confirmación absoluta (si quieres estar seguro al 100%)

En el próximo pico, lanza inmediatamente:

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

Si ves cientos de MB / GB asociados a DuckDB → veredicto final.


:seven: Qué hacer concretamente (soluciones realistas)

Opción A – Limitar DuckDB (recomendada)

En Gladys (código):

  • limitar el tamaño de las consultas
  • evitar agregados globales en el historial completo
  • dividir por período (día / semana)

Opción B – Forzar un límite de memoria de Node

:warning: Esto no resuelve la causa, pero evita el OOM del host:

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

:right_arrow: Atención: esto no limita lo nativo, pero evita apilar ambos.


Opción C – Reinicio programado (pragmático)

Si los picos son raros pero destructivos:

docker restart gladys
  • semanal
  • o después de una tarea pesada

Es muy común para DuckDB en producción.


:eight: Conclusión clara y neta

:check_mark: Tus datos son excelentes
:check_mark: El diagnóstico ahora es sólido

:backhand_index_pointing_right: No hay fuga de memoria JS
:backhand_index_pointing_right: La RAM se consume por asignaciones nativas (DuckDB muy probablemente)
:backhand_index_pointing_right: La memoria no baja porque se mantiene en el área nativa

Si quieres, siguiente paso posible:

  • identificar qué consulta de Gladys desencadena el pico
  • o ayudarte a parchear / sortear del lado de Gladys (log SQL, throttle, split)

¡Hasta luego!

¡Gracias por tus investigaciones, llego a las mismas conclusiones!!

Estoy haciendo las mismas investigaciones por mi lado, y también es claramente un problema de código nativo, el tamaño de la pila está contenido. ¡No es un problema de JS!

DuckDB, lo actualicé a la última versión, y también tengo problemas, me parece.

Puedes probar instalando gladysassistant/gladys:dev que ejecuta DuckDB v1.4.3.

Por lo tanto:

  • O es un error de DuckDB sin resolver hasta el día de hoy
  • O es otra cosa

Voy a probar, y para confirmar el asunto, fui a mi vista de curvas, mostré mi curva más grande del año:

Al final llegó a 9,70 GB y no se libera. Pero si entiendo lo que nos dice chatGPT, no es que no « libere », sino que node guarda en reserva esta « memoria máxima » desencadenada en un momento T por duckDB. Ahora bien, si hago muchas consultas rápidamente en todas mis curvas del año, al final mi memoria reservada no aumenta más… por lo tanto, efectivamente no debería, pero quizá es que está ahí desde el principio y habría que hacer algo en el código para « liberar » esta memoria reservada al sistema… ??

Después de eso, se especula, se especula ahí ^^

¡Tienes razón!!

Pero no es un error, es una característica :joy:

Pero claramente, el 80% es demasiado.

Podríamos pasar a un porcentaje más bajo, creo…

Jajaja, eso es lo que me parecía ^^

Mi consulta más grande « requeriría » 5GB ^^

Espero que reducir este número no afecte al rendimiento en tu caso, porque si se reduce la RAM, se utiliza el disco…

Quizás haya optimizaciones de consultas que hacer, aunque en este caso las consultas son extremadamente simples

Dime cuando tengas una imagen de prueba, haré la prueba para darte mi opinión. Podemos esperar que los NVMe sean lo suficientemente potentes.

¿Estamos haciendo paginación actualmente?

PD: Para información, cuando comparo el rendimiento de las curvas con el de HA, me parece que somos mucho, mucho más potentes hoy en día. Por lo tanto, tenemos un margen para hacerlo bien de todos modos.

Si puedes actuar sobre el límite manteniendo un % de la memoria total, sería genial, porque pienso pasar a 32 GB de RAM algún día con mi pasión por las curvas. !!^^

La PR:

He puesto un 30% por ahora, lo cual me parece bastante alto, pero bueno, ya es un gran salto desde el 80%..

Build en curso:

Estará en vivo en unos minutos en gladysassistant/gladys:set-duckdb-memory-limit

Podremos hablar de optimización en otro tema :slight_smile:

La imagen está en vivo en gladysassistant/gladys:set-duckdb-memory-limit

Lo estoy probando en mi casa

Parece que funciona:

DuckDB inicializado con memory_limit=4730MB (RAM del sistema: 15767MB)
Versión de DuckDB = v1.4.3
Límite de memoria de DuckDB = 4.4 GiB

No podría probarlo hasta mañana, no había visto la hora…!! Lo siento