Files
aiform_prod/docs/N8N_MEMORY_ISSUES.md
AI Assistant 02689e65db fix: Исправление загрузки документов и SQL запросов
- Исправлена потеря документов при обновлении черновика (SQL объединяет вместо перезаписи)
- Исправлено определение типа документа (приоритет field_label над field_name)
- Исправлены дубликаты в documents_meta и documents_uploaded
- Добавлена передача group_index с фронтенда для правильного field_name
- Исправлены все документы в таблице clpr_claim_documents с правильными field_name
- Обновлены SQL запросы: claimsave и claimsave_final для нового флоу
- Добавлена поддержка multi-file upload для одного документа
- Исправлены дубликаты в списке загруженных документов на фронтенде

Файлы:
- SQL: SQL_CLAIMSAVE_FIXED_NEW_FLOW.sql, SQL_CLAIMSAVE_FINAL_FIXED_NEW_FLOW_WITH_UPLOADED.sql
- n8n: N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js (поддержка group_index)
- Backend: documents.py (передача group_index в n8n)
- Frontend: StepWizardPlan.tsx (передача group_index, исправление дубликатов)
- Скрипты: fix_claim_documents_field_names.py, fix_documents_meta_duplicates.py

Результат: документы больше не теряются, имеют правильные типы и field_name
2025-11-26 19:54:51 +03:00

226 lines
9.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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