Llevo varias semanas con problemas con mi copia de seguridad de Gladys, pero no había tenido tiempo de hacer las comprobaciones necesarias.
De hecho, cada noche cuando se activa la copia de seguridad, Gladys se bloquea (no hay visualización del panel de control, no se activan escenas, etc.), esto dura aproximadamente 2 horas, luego recibo en Telegram el mensaje « Gladys acaba de reiniciarse » (es el resultado de una escena cuyo disparador es « Gladys arranca »), y todo funciona de nuevo.
Con la ayuda de Claude esta mañana, exploré el problema. En un paso de su análisis, respondí que tenía « una base media (algunos gigas) », pero no estoy seguro de haber respondido correctamente. En el historial de mis copias de seguridad, veo esto:
Como primera acción, Claude me sugirió modificar la RAM asignada a Gladys (con el comando sudo docker update --memory="6g" --memory-swap="8g" gladys), para que mi problema no provoque un bloqueo durante varias horas. Y efectivamente, cuando inicié manualmente una copia de seguridad, el fallo y el reinicio se produjeron en 3-4 minutos. Es mejor para no bloquear mi domótica, pero aún no resuelve el problema de la copia de seguridad fallida ![]()
Estoy ejecutando en un mini-PC Intel NUC5PPYB, procesador N3700 4 núcleos 1.6GHz, 8GB de RAM, bajo Ubuntu 22.04, y Gladys se instaló con el comando « docker run » estándar. No tengo nada más que Gladys en este servidor.
Aquí está el informe final de Claude:
Pico de memoria / OOM-kill durante la copia de seguridad GladysPlus
Resumen
Cada copia de seguridad GladysPlus (automática 2h-4h o manual) hace que la RAM del
contenedor Gladys aumente hasta el punto de desencadenar un OOM-kill del proceso Node, seguido de un
reinicio automático del contenedor.
Entorno
- Gladys en Docker en Mini PC/NUC
- RAM total del host: 7,7 GB (8 GB no ampliable)
- Base de datos: tamaño medio (algunos GB)
- Contenedor
gladyslimitado manualmente a 6 GB de RAM (docker update --memory)
para evitar que el OOM desestabilice todo el host (swap-thrashing observado antes
de la implementación de este límite)
Reproducción
Copia de seguridad manual iniciada a las 09:36.
- 09:36:01 - RSS antes del backup: 4388,77 MB, Heap 233,97/392,50 MB
- 09:36:01 - DuckDB antes del backup: Total 2248,75 MB (BASE_TABLE: 2246,00 MB,
IN_MEMORY_TABLE: 2,75 MB) - 09:36:04 - Apertura de una segunda instancia DuckDB dedicada al backup
(duckDbCreateBackupInstance,memory_limit=1024MB,threads=2,READ_ONLY)
para exportar a una carpeta Parquet - 09:38 - RAM del contenedor: ~6 GB (límite alcanzado)
- 09:40 -
Out of memory: Killed process ... (MainThread) - 09:41 - Contenedor reiniciado, Gladys de nuevo funcional
Sin el límite de 6 GB establecido manualmente a nivel Docker, el mismo fenómeno en
condiciones reales (copia de seguridad nocturna automática) provocó un episodio de
swap-thrashing en todo el host de 02:23 a 04:44 (panel de control y escenas
inutilizables), el RSS del proceso alcanzó 6774,54 MB antes del kill (dmesg :
Out of memory: Killed process 1542 (MainThread) total-vm:30424440kB, anon-rss:6774536kB).
Hipótesis
La nueva instancia DuckDB creada para el backup (limitada a 1024 MB) parece
sumarse a la memoria ya ocupada por la instancia DuckDB principal
(~2,25 GB), en lugar de compartir/respetar un presupuesto de memoria global del proceso.
En una máquina donde el proceso ya funciona a ~4,4 GB en reposo, la adición de
~1 GB adicional es suficiente para superar la RAM disponible.
Pregunta para los mantenedores
- ¿Es normal que
BASE_TABLEpermanezca casi íntegramente en memoria (2,25 GB)
en reposo, fuera de la copia de seguridad, para una base de tamaño medio ? - ¿Se puede reducir el
memory_limit=1024MBde la instancia de backup, o el
proceso de backup puede transmitir/procesar por lotes en lugar de cargar tanto
en memoria, para mantenerse dentro de un límite total razonable incluso en hardware con
8 GB de RAM ?

