# 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.

- Page: https://cua.ai/benchmarks/rollout-steps-per-second
- Measured: 2026-10-25
- Result: https://cua.ai/benchmarks/rollout-steps-per-second.json (no per-sample CSV for this run)
- 64 gVisor containers: 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; n = 1280
- 96 microVMs: 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; n = 1920

## 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.

## Environment (64 gVisor containers)

- 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

## Caveats (64 gVisor containers)

- 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).

## Reproduce (64 gVisor containers)

```sh
# 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 20
```

## Method (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.

## Environment (96 microVMs)

- 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

## Caveats (96 microVMs)

- 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.

## Reproduce (96 microVMs)

```sh
# 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 20
```

## 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.
