226 lines
9.4 KiB
Markdown
226 lines
9.4 KiB
Markdown
|
|
# 🐛 Проблемы с памятью в 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)
|
|||
|
|
|