Décrivez le problème/l’erreur/la question
Les exécutions parallèles utilisant le nœud Oracle Database natif ouvrent un grand nombre de sessions Oracle simultanées, et la base de données commence à souffrir de contention de verrous (latch contention).
Le problème fondamental est que le grand nombre de connexions Oracle ouvertes simultanément par n8n surcharge la base de données. Chaque connexion n8n correspond à une session dedicated-server sur Oracle, donc lorsque de nombreuses exécutions s’exécutent en parallèle, des dizaines de sessions sont ouvertes en même temps et l’instance commence à souffrir de contention de verrous. Mon objectif est de limiter le nombre de sessions Oracle pouvant être ouvertes simultanément afin que la base de données cesse d’être surcharge.
Je fonctionne en mode queue avec 3 conteneurs worker et N8N_WORKER_CONCURRENCY=10 (soit environ 30 exécutions simultanées).
Ma compréhension actuelle (veuillez me corriger) : en mode queue, chaque worker est un processus distinct, donc j’assume que le pool de connexions Oracle est créé par worker, ce qui signifie que Pool Max s’applique par worker et non globalement.
Questions :
-
Le pool de connexions Oracle est-il créé par processus worker (donc Pool Max par worker), ou est-il partagé d’une manière ou d’une autre ?
-
Lors des exécutions parallèles, le nœud extrait-il une connexion par exécution (1:1), ou par requête / par élément ?
-
Pour réduire les sessions Oracle simultanées, quelle est l’approche recommandée : réduire
N8N_WORKER_CONCURRENCY, réduire le nombre de workers, réduirePool Max, ou une combinaison ? Lequel est le bon levier principal ? -
Si je réduis
Pool Max, les demandes de connexion supplémentaires font-elles la queue et attendent une connexion libre au lieu de surcharger la base de données ? -
Ce nœud exécute-t-il node-oracledb en mode Thin ou Thick par défaut ? Si Thick, est-ce que
UV_THREADPOOL_SIZEdoit être configuré aux côtés de Pool Max ?
Quel est le message d’erreur (le cas échéant) ?
Aucune erreur au niveau de l’application dans n8n. Le symptôme se situe côté Oracle : des dizaines de sessions actives exécutant le même SQL_ID simultanément, bloquées sur latch: cache buffers chains et cpu runqueue. Exemple réduit :
SID SERIAL USER PROG TYPE STATE WAIT_CLASS EVENT
... 3332220 APPUSER node DED CPU Other cpu runqueue
... 3334370 APPUSER node DED CPU Concurrency latch: cache buffers chains
... 3331979 APPUSER node DED CPU Other latch free
... 3332223 APPUSER node DED CPU Other PGA memory operation
(des dizaines d'autres, même SQL_ID, mêmes événements d'attente)
Partagez votre workflow
(Non pertinent pour cette question. Le problème concerne la concurrence des connexions/sessions, non un workflow spécifique.)
Partagez le résultat renvoyé par le dernier nœud
(Non applicable.)
Configuration du pool Oracle actuelle (par credential)
-
Pool Min : 0
-
Pool Max : 600
-
Pool Increment : 5
-
Pool Maximum Session Life Time : 3600
-
Pool Connection Idle Timeout : 180
-
Connection Class Name : non défini
-
Connection Timeout : 0
-
Transport Connection Timeout : 20
-
Keepalive Probe Interval : 60
Informations sur votre configuration n8n
-
Version n8n : Version 2.20.7-exp.0
-
Version du nœud Oracle Database : Oracle Database node version 1 (Latest)
-
Base de données (base de données propre de n8n) : PostgreSQL 16
-
Version d’Oracle Database (base de données cible) :
-
Mode n8n EXECUTIONS_PROCESS / queue mode : queue mode (Redis/Bull), 3 workers,
N8N_WORKER_CONCURRENCY=10 -
Exécution de n8n via : Docker (auto-hébergé)
-
Système d’exploitation : RedHat