Build1 distinct publisher3 min readPublished
An operator's SQL against two identical boxes shows the queue stack buying crash isolation from hung model calls rather than headroom, with the binding limit sitting in the pruning cap instead of the CPU.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Little's law explains the 19 better than the hardware does. According to the dev.to writeup, 76,100 executions landed in a week, which is about 0.126 per second [3]. The number in flight equals arrival rate times mean residence time, so holding 19 at once implies a mean residence near 150 seconds [4]. Yet 88% of retained executions on that instance finish in under a second [4]. Both numbers hold only if the in-flight count is mostly made up of jobs that are not computing. The author says exactly that: the three longest runs in the window are AI workflows that hung on a model call and eventually errored, one for 7,320 seconds [7], and the in-flight figure also counts parent workflows sitting idle while sub-workflows run [12].
So 19 is a stall count wearing the costume of a load measurement. For it to transfer to your deployment, your nodes have to be doing close to nothing per run. That is what this traffic is: one gateway workflow in front of a WhatsApp bot took 11,880 executions a day and rejected most of them in its first node, 96% of them under a second [16]. Put real work behind the webhook, and in-flight starts mapping to CPU demand, at which point 2 vCPU [1] is the number that binds.
The price of admission is legible. The queue stack runs about 900 MiB of n8n processes against 507 MiB for the single-process box, with Redis a rounding error and the worker being a whole second n8n [5]. That is 393 MiB more, roughly 78% more resident memory [1], about a tenth of a 4 GB VPS [2]. There is no latency dividend to offset it, since a sub-second execution is sub-second in either mode and the queue only adds a Redis hop [6].
What the money buys is availability. A hung model call in single-process mode shares a process with the editor and the webhook listener, and a memory-hungry one takes everything with it; in queue mode it burns one worker slot out of five and the rest keeps flowing [8]. The author is explicit that this is an availability feature, not a performance feature [9]. Second on the list is restarts: the worker can be replaced while main keeps accepting webhooks and the queue holds jobs [10].
Two operating costs do not appear in the scaling advice. First, `docker compose up -d` starts main and worker together and both immediately attempt migrations on the same Postgres, and n8n has no cross-instance migration lock, so main wins and the worker dies with a `MigrationExecutor.executePendingMigrations` trace [13]. The fix is to wait for main to report healthy and restart the worker, which rejoins cleanly [14]. An unhealthy worker mid-upgrade also looks precisely like a half-migrated database, which is a memorable way to spend twenty minutes. Second, a dead worker fails silently: webhooks return 200, jobs enqueue, nothing runs [15].
Then the actual ceiling. n8n persists every execution by default, and the prune cap `EXECUTIONS_DATA_PRUNE_MAX_COUNT=50000` became the effective retention window, worth 2.5 days at this write rate [17]. That implies about 20,000 retained rows a day [6], of which the no-op gateway alone is roughly 59% [7]. Sixteen active workflows had no saved executions left at all [18]. A second worker changes where a job runs and not how many rows it writes, which is why the pruning cap is the line I would read before the concurrency setting.
Ranked by verification strength, evidence, and original report placement.
In the week measured, the queue-mode instance handled 76,100 executions and the single-process instance handled 322.
In regular mode such runs live in the same process that serves the editor and webhooks, and a memory-hungry one takes everything down; in queue mode each burned one worker slot out of five while everything else kept flowing.
The author describes crash isolation as the real feature and as an availability feature, not a performance feature.
The damage from that traffic was writes, not CPU: n8n persists every execution by default, and the pruning cap EXECUTIONS_DATA_PRUNE_MAX_COUNT=50000 became the effective retention window, with 50K rows worth 2.5 days at that rate.
The author runs two production n8n instances on identical 2 vCPU / 4 GB VPSes: one in queue mode with a dedicated worker, Redis and Postgres, the other in plain single-process mode.
At the single busiest moment of those 76,100 runs, exactly 19 executions were in flight at once, with the worker running --concurrency=5.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 30, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Path normalization strands the local storage backend under a root-owned /app1 distinct publisher
build
Queueing the OpenAI call turns model latency into a polling problem1 distinct publisher
build
94% in the demo, 11% in production: the agent gap is architectural1 distinct publisher
build
Three services you can delete: queue, cache and search in one Postgres1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One psql session, transparently shown
Unusually specific for a first-person infrastructure post: dated queries against both databases, docker stats snapshots, exact versions on the failed upgrade, and two of the SQL statements published so a reader can reproduce them locally. What holds it back is that the measuring surface prunes itself — the 88% figure is explicitly about retained executions, and the same post shows a 50,000-row cap trimming history to about 2.5 days, so the weekly counts are read from a table designed to forget. Nobody outside the author has run any of it.
Two boxes, one owner
Everything observable here is deployed and carrying real traffic — 76,100 executions in a week, a WhatsApp gateway at 11,880 a day, a live upgrade that broke — but the entire footprint is two servers belonging to the same person. There is no forum data, no survey, no vendor telemetry to say whether the pattern the author argues against is as widespread as claimed, so this reads as one deeply instrumented instance rather than evidence about how the wider n8n install base behaves.
Deflationary, with one box generalised
The rhetoric runs below the findings rather than above them. A story that could have been sold as a scaling triumph instead reports that 76,100 weekly executions peaked at 19 in flight, that the second process bought no speed, and that the genuinely painful failure — writes filling a database until three days of history vanished — no execution mode would have prevented. The pull in the other direction is the leap from two servers to a rule for everyone: 'volume is the wrong trigger' is a confident general claim resting on one operator's traffic mix.
Practitioner byline, no vendor stake
Self-published on dev.to under an automation-consultant handle, so audience and credibility are the plausible returns — and the piece is quotable precisely because it contradicts the community's standard advice. Nothing here reads as vendor-aligned: it documents a missing migration lock in n8n, a default that persists every execution, and a failure mode that hides outages behind HTTP 200s. No sponsorship, affiliation or client is disclosed either way, and none needs to be inferred.
Precise but uncorroborated
High confidence in the operational mechanics, lower in the numbers as a description of anything but this instance. The migration race and the silent dead worker are the kind of specific, checkable behaviour that other operators will confirm or refute quickly; the capacity and memory figures are single-sourced, single-week, and drawn from a self-pruning table. Two of the load claims — that queue mode adds no latency, and that most adopters over-buy — are argued rather than measured.