# 🐛 Проблемы с памятью в n8n ## 🔍 Симптомы - UI n8n не отвечает (нельзя сохранить workflow, включить/выключить) - Workflow не обрабатывает события - Страница зависает при попытке редактирования - Требуется перезагрузка сервера для восстановления ## 💾 Возможные причины ### 1. **Переполнение памяти (OOM)** - n8n процесс исчерпал доступную память - Система убивает процесс (OOM Killer) - Или процесс зависает в ожидании освобождения памяти **Диагностика:** ```bash # Проверка использования памяти n8n docker stats n8n_container --no-stream # Проверка логов OOM Killer dmesg | grep -i "out of memory" dmesg | grep -i "killed process" # Проверка использования памяти системой free -h ``` ### 2. **Утечки памяти в workflow** - Workflow накапливает данные в памяти - Большие массивы данных не освобождаются - Долгие операции держат данные в памяти **Диагностика:** - Проверить Execution History - сколько данных хранится - Проверить размер данных в workflow (большие JSON объекты) - Проверить количество активных executions ### 3. **Слишком много активных workflows** - Много workflows работают одновременно - Каждый workflow держит соединения и данные в памяти - Redis Trigger для каждого workflow = отдельное соединение **Диагностика:** ```bash # Количество активных workflows (через n8n API или БД) # Проверить количество Redis подписок redis-cli -h crm.clientright.ru -p 6379 -a "CRM_Redis_Pass_2025_Secure!" CLIENT LIST | grep -c "SUBSCRIBE" ``` ### 4. **Большие данные в workflow** - Workflow обрабатывает большие файлы/JSON - Данные хранятся в памяти между нодами - Нет очистки промежуточных данных **Диагностика:** - Проверить размер данных в Execution History - Проверить размер JSON payload между нодами - Проверить использование диска для execution data ### 5. **Проблемы с базой данных n8n** - База данных n8n переполнена старыми executions - Медленные запросы блокируют работу - Блокировки таблиц **Диагностика:** ```bash # Размер базы данных n8n # Проверить количество executions # Проверить медленные запросы ``` ## 🛠️ Решения ### 1. **Ограничить использование памяти** В `docker-compose.yml` для n8n: ```yaml services: n8n: mem_limit: 2g # Ограничить память до 2GB mem_reservation: 1g # Резервировать минимум 1GB oom_kill_disable: false # Разрешить OOM Killer убивать процесс ``` Или через переменные окружения: ```bash NODE_OPTIONS="--max-old-space-size=1536" # Ограничить heap до 1.5GB ``` ### 2. **Очистить старые executions** Настроить автоматическую очистку в n8n: - Settings → Workflows → Execution Data Retention - Установить срок хранения (например, 7 дней) - Включить автоматическую очистку Или через SQL (если используете PostgreSQL): ```sql -- Удалить executions старше 7 дней DELETE FROM execution_entity WHERE "stoppedAt" < NOW() - INTERVAL '7 days'; -- Удалить execution_data для удалённых executions DELETE FROM execution_data WHERE "executionId" NOT IN (SELECT id FROM execution_entity); ``` ### 3. **Оптимизировать workflow** - **Не хранить большие данные между нодами** - Использовать `Set` node для очистки ненужных полей - Не передавать большие файлы через workflow data - **Использовать streaming для больших данных** - Обрабатывать данные порциями - Не загружать всё в память сразу - **Ограничить размер данных в Redis Trigger** - Проверять размер сообщения перед обработкой - Отклонять слишком большие сообщения ### 4. **Мониторинг памяти** Создать скрипт для мониторинга: ```bash #!/bin/bash # monitor_n8n_memory.sh CONTAINER="n8n_container" THRESHOLD=80 # Процент использования памяти MEMORY_USAGE=$(docker stats $CONTAINER --no-stream --format "{{.MemPerc}}" | sed 's/%//') if (( $(echo "$MEMORY_USAGE > $THRESHOLD" | bc -l) )); then echo "⚠️ ВНИМАНИЕ: n8n использует ${MEMORY_USAGE}% памяти!" # Можно добавить отправку алерта fi ``` ### 5. **Настроить swap** Если сервер имеет swap, убедиться что он настроен: ```bash # Проверить swap swapon --show # Если нет swap, создать (осторожно - может замедлить работу) sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile ``` ### 6. **Ограничить количество активных workflows** - Отключить неиспользуемые workflows - Использовать один workflow вместо нескольких для похожих задач - Разделить сложные workflows на несколько простых ### 7. **Оптимизировать Redis Trigger** - Использовать один Redis Trigger для нескольких каналов (если возможно) - Ограничить количество одновременных подписок - Использовать Redis Streams вместо Pub/Sub для больших объёмов данных ## 📊 Диагностика после перезагрузки После перезагрузки сервера проверить: ```bash # 1. Использование памяти n8n docker stats n8n_container --no-stream # 2. Логи n8n на ошибки памяти docker logs n8n_container 2>&1 | grep -i "memory\|oom\|heap" # 3. Системные логи OOM Killer dmesg | grep -i "out of memory" | tail -20 # 4. Использование памяти системой free -h # 5. Топ процессов по использованию памяти ps aux --sort=-%mem | head -10 ``` ## 🔄 Профилактика 1. **Регулярная очистка executions** - Настроить автоматическую очистку старых данных - Ограничить срок хранения execution data 2. **Мониторинг ресурсов** - Настроить алерты при высоком использовании памяти - Регулярно проверять использование ресурсов 3. **Оптимизация workflows** - Избегать хранения больших данных в памяти - Использовать streaming для больших файлов - Очищать промежуточные данные 4. **Ограничения ресурсов** - Установить лимиты памяти для n8n контейнера - Настроить OOM Killer для корректной обработки 5. **Резервирование** - Рассмотреть использование нескольких инстансов n8n - Использовать load balancer для распределения нагрузки ## 📝 Рекомендации для продакшена 1. **Мониторинг**: Настроить Prometheus/Grafana для мониторинга памяти 2. **Алерты**: Настроить уведомления при превышении порога памяти 3. **Автоматическая очистка**: Настроить cron для очистки старых executions 4. **Лимиты**: Установить жёсткие лимиты памяти для n8n 5. **Логирование**: Включить детальное логирование использования памяти ## 🔗 Полезные ссылки - [n8n Memory Management](https://docs.n8n.io/hosting/configuration/environment-variables/#memory-management) - [Docker Memory Limits](https://docs.docker.com/config/containers/resource_constraints/#memory) - [Node.js Memory Management](https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes)