Introduzione

Se ultimamente le tue automazioni si sono “piantate” senza un motivo chiaro, sappi che non sei solo: nelle versioni 1.105.x–1.111.x diversi utenti hanno segnalato esecuzioni che da secondi passano a minuti, UI meno reattiva, errori 503 e perfino crash dovuti a memoria. Questo articolo è un playbook pratico di n8n troubleshooting performance pensato per chi usa n8n per lavorare meglio, non per passare ore nella diagnostica. In 15 minuti capirai come riconoscere i pattern di degrado, impostare una diagnosi end-to-end senza perdere produzione, profilare memoria e CPU con flamegraph e heap snapshot in V8, evitare lock e deadlock in Postgres, e gestire backpressure e concorrenza in modo elegante. Copriremo anche tuning di retention degli storici ed esecuzioni, limiti memoria Docker e garbage collector V8, e le best practice per grandi volumi di dati nei nodi n8n. Obiettivo: farti tornare alla produttività con un flusso stabile, misurabile e ottimizzato.

📚 Nuovo a n8n? Parti dalla guida completa: cos'è n8n e come funziona.

Cosa sta succedendo davvero: sintomi ricorrenti e quando preoccuparsi

Negli ultimi mesi la community ha riportato problemi di prestazioni concentrati su versioni 1.105.x–1.111.x: interfaccia lenta, esecuzioni più lunghe, errori 503, saturazione della memoria e difficoltà a consultare lo storico. Questi segnali spesso emergono su istanze Docker con Postgres, workflow con grandi volumi per nodo, pattern con Merge/Switch e loop, e scenari d’integrazione pesanti (HTTP, Microsoft/Outlook/Teams, NocoDB). Per un marketer, il problema è concreto: campagne che non si sincronizzano in tempo, lead che restano in coda, report che si aggiornano a singhiozzo.

Come distinguere un picco fisiologico da un problema strutturale:

  • Se UI e canvas rallentano subito dopo esecuzioni “corpose”, sospetta un collo di bottiglia in memoria o nell’event loop.
  • Se compaiono 503 e “Connection Lost”, verifica se l’istanza è diventata non disponibile per OOM o CPU al 100%.
  • Se gli storici diventano il “nuovo collo di bottiglia”, rivedi retention e pruning.
  • Se noti code crescenti e lavoratori che non smaltiscono, sei in backpressure.

Punto chiave: non affidarti al “feeling”. Implementa subito un percorso di diagnostica delle prestazioni di n8n con metriche, log e parametri controllati. Questo ti permette di correlare cambi versione/configurazione con i sintomi e accorciare il tempo di risoluzione.

Diagnosi end-to-end: metriche, log e baseline che contano

Prima di toccare qualsiasi impostazione, crea una baseline. Misura il tempo medio di esecuzione dei workflow critici, la stabilità del canvas, e gli errori in UI/API. Attiva log adeguati e segui questi passi:
1) Raccogli segnali di sistema

  • CPU, RAM, I/O del container n8n e del database Postgres.
  • Eventuali restart del container (spia di OOM).
  • Latenza media dei webhook e throughput delle code.

2) Configura le variabili di esecuzione essenziali

  • EXECUTIONSTIMEOUT ed EXECUTIONSTIMEOUT_MAX stabiliscono limiti di esecuzione per evitare run “zombie”.
  • EXECUTIONSDATASAVEONERROR e EXECUTIONSDATASAVEONSUCCESS per ridurre il peso degli storici quando non servono tutti i dettagli.

3) Verifica l’event loop

  • Se noti ritardi intermittenti, c’è probabilmente pressione sull’event loop. Un’analisi dell’event loop in ambienti n8n, con un profiler, ti dà evidenza di funzioni o nodi che bloccano.

4) Classifica i workflow per impatto

  • Elenca quelli con maggior numero di item per nodo o con loop profondi. Sono candidati per batching e refactoring.

Insight unico: collega sempre i picchi di latenza nei webhook e i time-to-complete dei workflow alle campagne o ai lanci che stai gestendo. Una mappa “campagna → workflow → KPI tecnici” aiuta a prevenire problemi prima dei picchi di traffico.

Profiling Node.js in n8n: flamegraph e heap snapshot in V8

Per identificare memory leak o hot path CPU, usa strumenti standard di Node.js con n8n self-hosted.

Step-by-step (Docker):
1) Avvia n8n con il debugging e un tetto di memoria adeguato

  • Imposta V8 e debugger:
  • NODE_OPTIONS=”–inspect=0.0.0.0:9229 –max-old-space-size=4096″
  • Esempio docker-compose (sezione environment):
  • NODE_OPTIONS=–inspect=0.0.0.0:9229 –max-old-space-size=4096

2) Collega Chrome DevTools

  • Apri chrome://inspect, aggiungi host:porta del container (es. 9229).
  • Registra una CPU profile mentre esegui un workflow “problematico”.
  • Cattura un heap snapshot per individuare oggetti che crescono nel tempo (flamegraph e heap snapshot in V8).

3) Interpreta i risultati

  • CPU: se vedi funzioni di parsing, trasformazioni massive o loop sincroni in cima al flamegraph, valuta Split In Batches e trasformazioni puntuali (Set/Move) per ridurre payload intermedi.
  • Memoria: oggetti che aumentano tra snapshot indicano leak. Verifica nodi che “accumulano” output inutilmente o cicli con dati non potati.

4) Rimedia subito

  • Riduci payload ai soli campi necessari prima dei nodi più costosi.
  • Evita concatenazioni di grandi array; usa batching.
  • Se necessario, aumenta temporaneamente la memoria di V8 (limiti memoria Docker e garbage collector V8 con –max-old-space-size) mentre refattorizzi.

Parole chiave utili: profiling memoria Node.js per workflow n8n, analisi dell’event loop in ambienti n8n.

Tuning Postgres: evitare slow query, lock e deadlock

Il database può diventare il collo di bottiglia se retention, query o concorrenza non sono gestite.

1) Individua lock e deadlock

  • Query operative:
  • SELECT pid, waiteventtype, waitevent, state, query FROM pgstat_activity WHERE state <> ‘idle’;
  • SELECT a.pid, l.locktype, l.mode, a.query FROM pglocks l JOIN pgstat_activity a ON a.pid = l.pid WHERE NOT granted;
  • Se vedi sessioni bloccate, individua la query lunga che trattiene il lock e valuta di intervenire riducendo retention o pianificando pruning in orari off-peak.

2) Attiva slow query log

  • Imposta logminduration_statement (es. 200ms) per catturare query lente.
  • Esegui EXPLAIN ANALYZE sulle query lente (copiale dai log) per capire se servono indici aggiuntivi o cambi di pattern nei workflow (es. evitare filtri multipli ripetuti).

3) Parametri di base (linee guida)

  • shared_buffers: ~25% RAM server.
  • effectivecachesize: 50–75% RAM.
  • work_mem: aumenta con cautela se hai molte sort/hash simultanee.
  • max_connections: mantienilo in un range realistico, evita saturazione.

4) Routine di manutenzione

  • Pruning regolare degli storici (vedi sezione successiva).
  • Evita scansioni massicce generate da filtri ad hoc in reporting; sposta aggregazioni su strumenti esterni quando possibile.

Parole chiave: tuning Postgres per esecuzioni n8n, lock e deadlock su pgstatactivity, slow query e EXPLAIN ANALYZE per n8n.

Backpressure e concorrenza: Queue mode, Redis e limiti di esecuzione

Se il carico supera la capacità, gestisci esplicitamente la concorrenza.

1) Abilita Queue mode

  • Variabile: EXECUTIONS_MODE=queue
  • Redis:
  • QUEUEBULLREDIS_HOST=localhost
  • QUEUEBULLREDIS_PORT=6379
  • Avvia worker separati e configura webhook processor se serve scalare gli ingressi.

2) Imposta limiti di concorrenza

  • In queue mode, controlla i job per worker via flag –concurrency.
  • Limite globale self-hosted: N8NCONCURRENCYPRODUCTION_LIMIT (valore > -1 per attivarlo).
  • Monitora i log: esecuzioni aggiunte in coda e rilasciate indicano backpressure e smaltimento.

3) Segmenta workload

  • Separare workflow ad alto throughput su worker dedicati.
  • Pianifica campagne e import/batch in finestre orarie diverse.

Parole chiave: backpressure e code di lavoro in n8n, concorrenza delle esecuzioni e impostazioni worker.

Retention, pruning e storici: riduci il peso senza perdere controllo

Storici troppo “ricchi” rallentano DB e UI. Configura le variabili dedicate:

  • EXECUTIONSDATASAVEONERROR=all|none (default all)
  • EXECUTIONSDATASAVEONSUCCESS=all|none (default all)
  • EXECUTIONSDATASAVEONPROGRESS=true|false (default false)
  • EXECUTIONSDATASAVEMANUALEXECUTIONS=true|false (default true)
  • EXECUTIONSDATAPRUNE=true|false (default true)
  • EXECUTIONSDATAMAX_AGE=336 (ore; default 14 giorni)
  • EXECUTIONSDATAPRUNEMAXCOUNT=10000 (0 = illimitato)
  • EXECUTIONSTIMEOUT, EXECUTIONSTIMEOUT_MAX per interrompere esecuzioni troppo lunghe

Esempio docker-compose (estratto):

  • EXECUTIONS_MODE=queue
  • QUEUEBULLREDIS_HOST=redis
  • QUEUEBULLREDIS_PORT=6379
  • EXECUTIONSDATASAVEONSUCCESS=none
  • EXECUTIONSDATASAVEONERROR=all
  • EXECUTIONSDATAPRUNE=true
  • EXECUTIONSDATAMAX_AGE=168
  • EXECUTIONSDATAPRUNEMAXCOUNT=5000
  • EXECUTIONS_TIMEOUT=1800
  • EXECUTIONSTIMEOUTMAX=3600
  • NODE_OPTIONS=–max-old-space-size=4096

Suggerimento: se usi SQLite in dev, lo spazio non si libera immediatamente con il prune ma viene riutilizzato; con Postgres tieni d’occhio dimensione e vacuum.

Parole chiave: retention degli storici ed esecuzioni in n8n.

Best practice per grandi volumi di dati nei nodi n8n

Quando un nodo processa migliaia di item, i colli di bottiglia emergono presto. Ecco come evitarli:

  • Split In Batches: spezza dataset in chunk gestibili e serializza i passi più pesanti.
  • Riduci il payload: usa Set/Move per mantenere solo i campi necessari prima di chiamate HTTP o merge.
  • Minimizza anteprime e dati non necessari: durante lo sviluppo puoi vedere tutto; in produzione punta all’essenziale.
  • Evita loop profondi con trasformazioni sincrone pesanti; sposta calcoli complessi a servizi dedicati o funzioni serverless.
  • Valuta storage esterni per binari pesanti; mantieni il DB “snello”.
  • Pianifica retry e backoff intelligenti: la gestione errori efficace riduce rielaborazioni massicce.

Risultato: workflow più stabili e veloci, meno memory spike e un carico prevedibile. Parole chiave: best practice per grandi volumi di dati nei nodi n8n.

Playbook di rollback/canary e verifica dei fix

  • Canary release: aggiorna 1 worker o 1 progetto alla volta, confronta KPI di esecuzione e errori con il gruppo di controllo.
  • Rollback rapido: mantieni le versioni Docker precedenti pronte al deploy.
  • Test mirati: ricarica i dati di un’esecuzione fallita nell’editor (Debug/Copy to editor) per validare fix senza rischi.
  • Osservabilità: mantieni un cruscotto con tempi di esecuzione, errori, code e utilizzo RAM/CPU per vedere effetti dei cambi subito.

Insight: collega i tuoi KPI marketing (lead elaborati/ora, tempi di sync CRM, tempi di invio) ai KPI tecnici. Quando ottimizzi, verifica sempre l’effetto sul risultato di business.

Quick Takeaways

  • Metti in sicurezza la diagnostica: baseline, log e profiler prima di cambiare impostazioni.
  • Usa flamegraph e heap snapshot per trovare hot path e memory leak reali.
  • Abilita Queue mode e limita la concorrenza per gestire backpressure.
  • Tieni sotto controllo Postgres con pgstatactivity, pg_locks e slow query log.
  • Configura retention e pruning con EXECUTIONSDATA* per evitare DB pesante e UI lenta.
  • Per grandi volumi, applica batching e riduci il payload fra i nodi.
  • Pianifica canary/rollback per aggiornamenti sicuri e misurabili.

Conclusione

n8n è straordinariamente flessibile, ma proprio questa libertà può portare a colli di bottiglia se non metti in campo una metodologia solida. Con il playbook che hai appena letto puoi affrontare n8n troubleshooting performance in modo professionale: diagnosi mirata, profiling memoria e CPU, lettura dei segnali del database, gestione della concorrenza e backpressure, e una policy di retention snella. Per un marketer, tutto questo si traduce in automazioni più affidabili e campagne che girano puntuali, senza sorprese all’ultimo miglio. Fai piccoli passi: abilita Queue mode, limita la concorrenza, riduci lo storico agli insight davvero utili, spezza i dataset e monitora l’effetto sui KPI di business. Se vuoi portare le tue automazioni al livello successivo, crea ora una checklist di tuning da applicare ai tuoi 3 workflow più critici e misura il miglioramento già questa settimana.

FAQ

1) Come faccio la diagnostica delle prestazioni di n8n senza fermare la produzione?

  • Imposta una baseline, attiva i log, usa EXECUTIONS_TIMEOUT per prevenire run infinite, e abilita Queue mode per isolare i worker. Poi esegui profiling memoria Node.js per workflow n8n su un ambiente di staging o su un worker canary.

2) Come analizzare l’event loop in ambienti n8n?

  • Avvia n8n con NODE_OPTIONS=”–inspect=0.0.0.0:9229″ e usa Chrome DevTools per registrare CPU profile. Il flamegraph evidenzia funzioni bloccanti e ti guida nel refactoring di nodi e trasformazioni.

3) Quali variabili impostare per evitare storici troppo pesanti?

  • Usa EXECUTIONSDATASAVEONSUCCESS=none quando non servono i dettagli dei successi, mantieni EXECUTIONSDATASAVEONERROR=all, imposta EXECUTIONSDATAPRUNE=true, EXECUTIONSDATAMAXAGE e EXECUTIONSDATAPRUNEMAX_COUNT per il pruning automatico.

4) Come rilevare lock e deadlock in Postgres legati a n8n?

  • Interroga pgstatactivity e pglocks per vedere sessioni in attesa e lock non concessi. Attiva slow query log e usa EXPLAIN ANALYZE sulle query lente per ottimizzare. Parole chiave: lock e deadlock su pgstat_activity, slow query e EXPLAIN ANALYZE per n8n.

5) Come gestire backpressure e concorrenza delle esecuzioni e impostazioni worker?

  • Abilita EXECUTIONSMODE=queue, configura Redis (QUEUEBULLREDISHOST/PORT) e limita la concorrenza con –concurrency e N8NCONCURRENCYPRODUCTION_LIMIT. Applica Split In Batches e riduci il payload per mantenere la coda fluida.

Hai trovato utile questa guida? Raccontaci nei commenti qual è stato il collo di bottiglia più subdolo che hai risolto e condividila con chi usa n8n in team: potrebbe far risparmiare ore di debug anche a loro!

Vuoi automazioni AI su misura per la tua azienda?
Scopri la consulenza →