I seen it, your settings are landing in the wrong places.
N8N_RUNNERS_MAX_CONCURRENCY controls task runners, the sandbox that executes Code nodes. It has nothing to do with how many executions run at once.
N8N_CONCURRENCY_PRODUCTION_LIMIT applies to a main instance running in regular mode. In queue mode the main only enqueues, so it does nothing on either container.
N8N_WORKER_CONCURRENCY is sitting on your main service rather than the worker, so it is on the wrong container either way.
In queue mode the number that matters is the worker’s own concurrency, default 10, which is exactly the limit you are hitting. Set it on the command:
n8n-worker:
command: worker concurrency=30
Recreate the worker after that. Total throughput is concurrency times worker count, so scale the service if one worker isn’t enough.
After restarting my container, I checked the worker’s log:
n8n Task Broker ready on 0.0.0.0, port 5679
Discovered 4 cluster checks
n8n worker server listening on port 5678
n8n worker is now ready
* Version: 2.30.7
* Concurrency: 10
I even added a new worker and a new task runner with same configuration, but from the logs the worker’s Concurrency is always 10.
Hi @mobabel concurrency is a CLI flag and needs the two dashes, without them Docker passes it as a plain argument and the worker never picks it up:
command: worker --concurrency=20
The startup line reports the value actually in use, so you’ll see Concurrency: 20 there once it takes. n8n reads that number from N8N_CONCURRENCY_PRODUCTION_LIMIT whenever it’s set to anything other than -1 and only falls back to the flag when it isn’t, so keep that variable off the worker or set it to the same value.
The command is missing the dashes. You have worker concurrency=20, it needs to be --concurrency=20. Without them n8n treats it as a stray argument, ignores it, and falls back to the default 10, which is exactly what your log is showing.
command: worker --concurrency=20
Recreate the container after the change, docker compose up -d --force-recreate n8n-worker. The log should then print Concurrency: 20 on startup, that line is your confirmation.
If you would rather set it as an env var instead, N8N_CONCURRENCY_PRODUCTION_LIMIT=20 on the worker service does the same thing, but it has to be on the worker, not the main.