Сервер n8n не отвечает. Надо разбираться. Ответ от демона сразу после перезагрузку натолкнул на мысль что сценарий проблемный не один, а их много
Active: active (running)
Memory: 3.2G
CPU: 3min 25s за 2min 54s
Решение нашел и хочу его описать, потому что может пригодится и другим.
Остановил n8n
systemctl stop n8n; sleep 5; pkill -u n8n_5ha_ru_usr -f ‘/usr/bin/n8n’ || true; ps aux | grep ‘[n]8n’
Сделал бэкап поля “активные сценарии”
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «DROP TABLE IF EXISTS workflow_active_backup_before_crash; CREATE TABLE workflow_active_backup_before_crash AS SELECT id, name, active FROM workflow_entity;»‘
Отключил активные сценарии
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «UPDATE workflow_entity SET active=false WHERE active=true;»‘
Посмотрел статусы запусков
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «SELECT status, count(*) FROM execution_entity GROUP BY status ORDER BY count(*) DESC;»‘
Там было 21000+ сценариев со статусом new: фантомные запуски. В реальности они завершены, но n8n после перезагрузки пробовал продолжить с ними работу и уходил в 100% загрузку.
status | count
———-+———
success | 262854
error | 151400
crashed | 25330
new | 21617
canceled | 2070
(5 rows)
Посмотрел имена сценариев, которые создают проблемы.
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «SELECT e.id, e.status, e.mode, e.\»workflowId\», w.name, e.\»startedAt\», e.\»stoppedAt\» FROM execution_entity e LEFT JOIN workflow_entity w ON w.id=e.\»workflowId\» WHERE e.\»stoppedAt\» IS NULL OR e.status IN (‘\»running’\»,’\»new’\»,’\»waiting’\») ORDER BY e.\»startedAt\» DESC LIMIT 100;»‘
Прибил все фантомные запуски
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «UPDATE execution_entity SET status=’\»crashed’\», \»stoppedAt\»=NOW() WHERE \»stoppedAt\» IS NULL OR status IN (‘\»running’\»,’\»new’\»);»‘
Запуск заново
systemctl start n8n; sleep 15; systemctl status n8n —no-pager -l; ss -lntp | grep -E ‘:5678|:443|:80’; curl -I http://127.0.0.1:5678
Проверил все и вернул обратно статус “активен” тем сценариям что выключил.
Проверка не копятся ли новые new
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «SELECT status, count(*) FROM execution_entity WHERE \»startedAt\» > NOW() — INTERVAL ‘\»10 minutes’\» GROUP BY status ORDER BY count(*) DESC;»‘
Удаление canceled, crashed, crushed пачками по 5000
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; while true; do deleted=$(PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -t -A -c «WITH del AS (SELECT id FROM execution_entity WHERE status IN (‘\»canceled’\»,’\»crashed’\»,’\»crushed’\») LIMIT 5000), del_ann AS (SELECT id FROM execution_annotations WHERE \»executionId\» IN (SELECT id FROM del)), d_tags AS (DELETE FROM execution_annotation_tags WHERE \»annotationId\» IN (SELECT id FROM del_ann)), d_ann AS (DELETE FROM execution_annotations WHERE id IN (SELECT id FROM del_ann)), d_meta AS (DELETE FROM execution_metadata WHERE \»executionId\» IN (SELECT id FROM del)), d_data AS (DELETE FROM execution_data WHERE \»executionId\» IN (SELECT id FROM del)), d_entity AS (DELETE FROM execution_entity WHERE id IN (SELECT id FROM del) RETURNING id) SELECT COUNT(*) FROM d_entity;»); echo «deleted=$deleted»; [ «$deleted» = «0» ] && break; sleep 1; done’
###########################################################################
id | name | active
——————+———————————————-+———
Be0NnZfN4ltrCpGQ | Контроллер рутин Регулярность | f
C8SEFHuRPhoOese2 | Обработчик ошибок Сафина | f
S06KJnLaaCXqQG03 | Контроллер рутин | f
ndiM2A2FzDedUrqR | Execute Запуск задачи из НФ. Проверка правил | f
ai0LgsH9kH4H7so8 | Проверка правила Не требуется если | f
U9NckfZkaqjb6TC5 | НФ Правило Моментальный запуск child ▫ | f
(6 rows)