Triage Factory performance
Sandbox Performance & Capacity

Capacity,
measured

A guide to what a sandboxed agent run costs and how to size a host for the fleet you want. Every run gets its own gVisor sandbox, network namespace, and private subnet — the isolation machinery adds about 25 MB and a quarter of a second per run, and one host scales to 256 concurrent runs without latency bending.

how the sandbox is sealed linear memory scaling 256 runs per host
256
concurrent runs
per host — every one healthy at the ceiling
~220
ms to spawn
namespace, subnet, firewall rules, sandbox boot
~25
MB of overhead
the marginal cost of one more sandbox
~0.25
GB per agent
planning budget per concurrent run, all-in
01 The cost of a run

The sandbox is 10% of the footprint.

A run's memory footprint is dominated by the model runtime, its context, and its tools. The sandbox wrapped around it (a gVisor kernel, a dedicated network namespace, per-run firewall rules) adds about 25 MB.

memory per concurrent run · planning budget ~256 MB
Sandbox isolation ~25 MB
gVisor sandbox kernel · netns + veth · per-run firewall
The agent itself ~230 MB
agent engine · context · tool processes · working files

Marginal, not naive: the engine's read-only code pages are shared across every sandbox on a host, so each additional run costs only its private memory — measured at fleet scale, not extrapolated from one process.

spawn
~220 ms
from delegation to a booted sandbox
ready
< 1 s
agent process resident and working
teardown
~46 ms
namespace, rules, and workspace reclaimed
02 Latency under load

Linear latency scaling.

The isolation primitives are constant-time: spawning the 250th sandbox costs the same as spawning the 8th, and starting one more run while the host is loaded stays in the same third of a second.

median latency vs. live sandboxes sandbox spawn one more full run
Median latency in milliseconds by number of live sandboxes
Live sandboxesSandbox spawnOne more full run
8220 ms340 ms
16270 ms340 ms
32240 ms340 ms
64190 ms320 ms
96195 ms315 ms
128200 ms330 ms
192205 ms335 ms
256215 msat capacity

“One more full run” is the whole lifecycle — allocate a subnet, create the namespace, install firewall rules, boot the sandbox, execute, tear everything down — started while every other sandbox on the host stays live. At 256 the line ends because a 257th subnet can’t exist.

03 Sizing a host

Capacity is a straight line.

Memory is the budget; everything else has slack. Each concurrent run costs a flat ~0.25 GB all-in, and the relationship stays linear all the way to the ceiling — no cliff, no per-run tax that compounds. Size a host by working backwards from the fleet you want.

concurrent agent runs by host memory
Concurrent agent runs by host memory
Host memoryConcurrent runs
16 GBabout 16
32 GBabout 80
48 GBabout 144
64 GBabout 200
96 GB256 (per-host ceiling)
the sizing rule
runs ≈ (RAM − 12 GB) ÷ 0.25 GB

Reserve ~12 GB for the host — the platform itself plus safety headroom the scheduler never touches — then budget a quarter-gigabyte per concurrent run, up to the 256-run ceiling.

and the CPUs?

Agents are I/O-bound — a typical run averages ~5% of one core while it reasons, edits, and waits on builds. CPU pressure only appears under sustained all-core synthetic load, and even at 2× oversubscription runs complete without failures. Memory runs out first.

04 The ceiling

256 by construction.

The 256-run limit isn't a tunable someone forgot to raise — it falls out of the isolation design. Every run owns a private /24 subnet carved from one reserved /16, so exactly 256 can exist on a host at once. The same structure that makes cross-run snooping impossible at the link layer sets the ceiling.

one /16 · 256 private /24s · one per run
live run · 10.42.N.0/24 free slot

Runs never share a network segment, so there is no bridge to police and no policy to misconfigure — and no 257th slot to hand out. Need more than 256 concurrent agents? Add a host; capacity scales horizontally.

Inside the sandbox →

Figures are medians measured on commodity x86 server hardware with a warm sandbox image cache — synthetic workloads for the latency curves, and fleets of the real agent engine driving multi-turn tool-use conversations for the per-run memory numbers. Real runs vary with task size, model, and repository; treat the sizing rule as planning guidance and validate against your own workloads before committing hardware.