How many agent steps per second can one Mac run?
A trainer-style loop on one Mac completed 120.9 steps/s across 64 headless gVisor Spaces and 1,946 steps/s across 96 microVM Spaces (mean over each run, 20 steps per Space) on a Mac Studio (Apple M2 Max, 96 GB), measured 2026-10-25. The microVM run lasted about one second, so its figure is a burst rate.
Measured Build app 0.15.0, cua 0.9.0, cua-spacesd 0.8.0Result (JSON)
Results
Completed steps divided by the loop's wall time. Higher is better.
| Result | Value | n | Measured |
|---|---|---|---|
| 64 gVisor containers | 120.9 steps/s mean | 1280 | 2026-10-25 |
| 96 microVMs | 1,946 steps/s mean | 1920 | 2026-10-25 |
Method: 64 gVisor containers
Driver on the host: rollout_bench rollout --steps 20 (Rust SDK, built from the tag), the trainer-shaped loop, against 64 (headline) and then 256 running headless gVisor Spaces (the first 256-batch above, kept). Every Space runs 20 steps concurrently; one step = exec a short shell line that writes a reward file, upload a 4 KB action file, download the reward. steps/s = all completed steps / wall time of the loop. Workloads run in the Spaces; the trainer loop runs on the host.
Caveats
- 64 of 256 running Spaces were stepped (the other 192 idle). At 256 Spaces the loop ran at 108.5 steps/s.
- All gVisor Spaces run inside the built-in Linux runtime VM at its default size here (4 vCPU, 32 GiB).
Environment and build
| Machine | Mac Studio, Mac14,13 (Mac Studio) |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 (25G83) |
| Where | local |
| Kind | gvisor |
| Image | ghcr.io/trycua/linux:24.04-slim |
| Shape | 1 vCPU, 1 GiB per Space, --headless |
| Settings | CUA_POOL_AUTO=off; built-in Linux runtime VM at its default size on this Mac, 4 vCPU / 32 GiB (CUA_RUNTIME_LINUX_CPUS=12 / MEMORY_GIB=64 were in the daemon's environment but the runtime VM was already running and kept its size, per the daemon log) |
| Other vms | 1 |
| Network | n/a (local) |
| Build | Cua Spaces 0.15.0 DMG (https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg, sha256 8725a09ba4132aa8a1667fa48c86416c91d5dec0d3c7dc93f88f5f3e29e0aba0): bundled cua 0.9.0, Helpers/cua-spacesd 0.8.0, cua-vz |
| App | 0.15.0 |
| cua | 0.9.0 |
| cua_spacesd | 0.8.0 |
Reproduce
# On an Apple silicon Mac (macOS 26), with Rust (rustup) and git:
curl -fLO https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg
hdiutil attach -nobrowse -mountpoint /tmp/cua-dmg cua-spaces-0.15.0-darwin-universal.dmg
mkdir -p ~/bench && ditto "/tmp/cua-dmg/Cua Spaces.app" ~/bench/"Cua Spaces.app" && hdiutil detach /tmp/cua-dmg
git clone --depth 1 --branch cua-spaces-v0.15.0 https://github.com/trycua/cua ~/bench/cua
(cd ~/bench/cua/libs/cua && cargo build --locked --release -p cua-sdk --example rollout_bench --example channel_bench)
export PATH="$HOME/bench/Cua Spaces.app/Contents/MacOS:$PATH" CUA_HOME=~/bench/home DO_NOT_TRACK=1 CUA_TELEMETRY=0
RB=~/bench/cua/libs/cua/target/release/examples/rollout_bench
CUA_POOL_AUTO=off cua daemon start --foreground &
ulimit -n 65536
$RB create --prefix u1- --n 256 --conc 64 --cpus 1 --memory-mb 1024 --kind container --runtime gvisor --headless --keep
$RB rollout --prefix u1- --n 64 --steps 20
$RB rollout --prefix u1- --n 256 --steps 20Method: 96 microVMs
Driver on the host: rollout_bench rollout --steps 20 (Rust SDK, built from the tag) against 96 running headless microVM Spaces (runtime vz), created first with rollout_bench create --n 96 --conc 16 --keep. Every Space runs 20 steps concurrently; one step = exec a short shell line that writes a reward file, upload a 4 KB action file, download the reward. steps/s = completed steps / wall time of the loop. Also run at 64 microVMs.
Caveats
- Burst rate: 20 steps x 96 Spaces finished in about 1 second. A longer run was not measured.
- At 64 microVMs the loop ran at 1,859 steps/s.
Environment and build
| Machine | Mac Studio, Mac14,13 (Mac Studio) |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 (25G83) |
| Where | local |
| Kind | microvm (runtime vz) |
| Image | ghcr.io/trycua/linux:24.04-slim |
| Shape | 1 vCPU, 1 GiB, --headless |
| Settings | CUA_POOL_AUTO=off |
| Other vms | 1 |
| Network | n/a (local) |
| Build | Cua Spaces 0.15.0 DMG (https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg, sha256 8725a09ba4132aa8a1667fa48c86416c91d5dec0d3c7dc93f88f5f3e29e0aba0): bundled cua 0.9.0, Helpers/cua-spacesd 0.8.0, cua-vz |
| App | 0.15.0 |
| cua | 0.9.0 |
| cua_spacesd | 0.8.0 |
Reproduce
# On an Apple silicon Mac (macOS 26), with Rust (rustup) and git:
curl -fLO https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg
hdiutil attach -nobrowse -mountpoint /tmp/cua-dmg cua-spaces-0.15.0-darwin-universal.dmg
mkdir -p ~/bench && ditto "/tmp/cua-dmg/Cua Spaces.app" ~/bench/"Cua Spaces.app" && hdiutil detach /tmp/cua-dmg
git clone --depth 1 --branch cua-spaces-v0.15.0 https://github.com/trycua/cua ~/bench/cua
(cd ~/bench/cua/libs/cua && cargo build --locked --release -p cua-sdk --example rollout_bench --example channel_bench)
export PATH="$HOME/bench/Cua Spaces.app/Contents/MacOS:$PATH" CUA_HOME=~/bench/home DO_NOT_TRACK=1 CUA_TELEMETRY=0
RB=~/bench/cua/libs/cua/target/release/examples/rollout_bench
CUA_POOL_AUTO=off cua daemon start --foreground &
$RB create --prefix rmv- --n 96 --conc 16 --cpus 1 --memory-mb 1024 --kind microvm --headless --keep
$RB rollout --prefix rmv- --n 64 --steps 20
$RB rollout --prefix rmv- --n 96 --steps 20Cua commands use the published Cua Spaces 0.15.0 release and the public trycua/cua repository at the tag cua-spaces-v0.15.0. Downloads: result (JSON), this page as Markdown. This run recorded summary percentiles, not one row per sample, so there is no CSV.
Questions
What is one step?
Run a short shell line in the Space that writes a reward file, upload a 4 KB action file, and download the reward. The trainer loop runs on the host.
Is the microVM number sustained?
No. That run finished in about one second, so it is a burst rate; a longer run wasn't measured.
Can I run this myself?
Yes. The commands under Reproduce use the published Cua Spaces 0.15.0 release and the public trycua/cua repository at the tag cua-spaces-v0.15.0. A `cua bench run` command that wraps them is coming; it isn't in a release yet.
Checked 2026-10-25. Sources: the samples and result files above, measured by Cua. All benchmarks.