{
  "slug": "rollout-steps-per-second",
  "question": "How many agent steps per second can one Mac run?",
  "answer": "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.",
  "status": "measured",
  "url": "https://cua.ai/benchmarks/rollout-steps-per-second",
  "csv": "https://cua.ai/benchmarks/rollout-steps-per-second.csv",
  "markdown": "https://cua.ai/benchmarks/rollout-steps-per-second.md",
  "group": "Density and throughput",
  "series": [
    {
      "label": "64 gVisor containers",
      "run": {
        "run": "2026-10-25",
        "schema": "cua.bench-result/v1",
        "bench": "rollout.gvisor",
        "slug": "rollout-steps-per-second",
        "metric": "steps_per_s",
        "value": 120.9,
        "unit": "steps/s",
        "stat": "mean",
        "n": 1280,
        "percentiles": {
          "step_ms_p50": 488.3,
          "step_ms_p95": 738.9,
          "step_ms_p99": 814.2
        },
        "extra": {
          "sandboxes": 64,
          "errors": 0,
          "secs": 10.59,
          "at_256_steps_per_s": 108.5,
          "at_256_step_ms_p50": 2447.6,
          "at_256_step_ms_p95": 3322,
          "at_256_errors": 0
        },
        "measured_at": "2026-10-25T01:36:00Z",
        "build": {
          "cua": "0.9.0",
          "cua_spacesd": "0.8.0",
          "app": "0.15.0",
          "source": "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",
          "published": true,
          "harness": "built from tag cua-spaces-v0.15.0 (709b18d9ee) on the host: cargo build --release -p cua-sdk --example rollout_bench --example channel_bench (Rust 1.97.1)"
        },
        "host": {
          "name": "Mac Studio",
          "model": "Mac14,13 (Mac Studio)",
          "chip": "Apple M2 Max",
          "cpus": 12,
          "memory_gb": 96,
          "os": "macOS 26.6.2 (25G83)",
          "where": "local"
        },
        "environment": {
          "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)",
          "load_avg_before": [
            1.39,
            4.28,
            5.29
          ],
          "other_vms": 1,
          "network": "n/a (local)"
        },
        "method": "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.",
        "reproduce": "# On an Apple silicon Mac (macOS 26), with Rust (rustup) and git:\ncurl -fLO https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg\nhdiutil attach -nobrowse -mountpoint /tmp/cua-dmg cua-spaces-0.15.0-darwin-universal.dmg\nmkdir -p ~/bench && ditto \"/tmp/cua-dmg/Cua Spaces.app\" ~/bench/\"Cua Spaces.app\" && hdiutil detach /tmp/cua-dmg\ngit clone --depth 1 --branch cua-spaces-v0.15.0 https://github.com/trycua/cua ~/bench/cua\n(cd ~/bench/cua/libs/cua && cargo build --locked --release -p cua-sdk --example rollout_bench --example channel_bench)\nexport PATH=\"$HOME/bench/Cua Spaces.app/Contents/MacOS:$PATH\" CUA_HOME=~/bench/home DO_NOT_TRACK=1 CUA_TELEMETRY=0\nRB=~/bench/cua/libs/cua/target/release/examples/rollout_bench\nCUA_POOL_AUTO=off cua daemon start --foreground &\nulimit -n 65536\n$RB create --prefix u1- --n 256 --conc 64 --cpus 1 --memory-mb 1024 --kind container --runtime gvisor --headless --keep\n$RB rollout --prefix u1- --n 64 --steps 20\n$RB rollout --prefix u1- --n 256 --steps 20",
        "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)."
        ],
        "sources": [],
        "status": "measured"
      }
    },
    {
      "label": "96 microVMs",
      "run": {
        "run": "2026-10-25/result-microvm",
        "schema": "cua.bench-result/v1",
        "bench": "rollout.microvm",
        "slug": "rollout-steps-per-second",
        "metric": "steps_per_s",
        "value": 1945.5,
        "unit": "steps/s",
        "stat": "mean",
        "n": 1920,
        "percentiles": {
          "step_ms_p50": 48,
          "step_ms_p95": 66.9,
          "step_ms_p99": 119.1
        },
        "extra": {
          "sandboxes": 96,
          "errors": 0,
          "secs": 0.987,
          "at_64_steps_per_s": 1859.4,
          "at_64_step_ms_p50": 31.2,
          "at_64_step_ms_p95": 62.8
        },
        "measured_at": "2026-10-25T02:37:30Z",
        "build": {
          "cua": "0.9.0",
          "cua_spacesd": "0.8.0",
          "app": "0.15.0",
          "source": "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",
          "published": true,
          "harness": "built from tag cua-spaces-v0.15.0 (709b18d9ee) on the host: cargo build --release -p cua-sdk --example rollout_bench --example channel_bench (Rust 1.97.1)"
        },
        "host": {
          "name": "Mac Studio",
          "model": "Mac14,13 (Mac Studio)",
          "chip": "Apple M2 Max",
          "cpus": 12,
          "memory_gb": 96,
          "os": "macOS 26.6.2 (25G83)",
          "where": "local"
        },
        "environment": {
          "kind": "microvm (runtime vz)",
          "image": "ghcr.io/trycua/linux:24.04-slim",
          "shape": "1 vCPU, 1 GiB, --headless",
          "settings": "CUA_POOL_AUTO=off",
          "load_avg_before": [
            1.41,
            2.22,
            2.53
          ],
          "other_vms": 1,
          "network": "n/a (local)"
        },
        "method": "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.",
        "reproduce": "# On an Apple silicon Mac (macOS 26), with Rust (rustup) and git:\ncurl -fLO https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg\nhdiutil attach -nobrowse -mountpoint /tmp/cua-dmg cua-spaces-0.15.0-darwin-universal.dmg\nmkdir -p ~/bench && ditto \"/tmp/cua-dmg/Cua Spaces.app\" ~/bench/\"Cua Spaces.app\" && hdiutil detach /tmp/cua-dmg\ngit clone --depth 1 --branch cua-spaces-v0.15.0 https://github.com/trycua/cua ~/bench/cua\n(cd ~/bench/cua/libs/cua && cargo build --locked --release -p cua-sdk --example rollout_bench --example channel_bench)\nexport PATH=\"$HOME/bench/Cua Spaces.app/Contents/MacOS:$PATH\" CUA_HOME=~/bench/home DO_NOT_TRACK=1 CUA_TELEMETRY=0\nRB=~/bench/cua/libs/cua/target/release/examples/rollout_bench\nCUA_POOL_AUTO=off cua daemon start --foreground &\n$RB create --prefix rmv- --n 96 --conc 16 --cpus 1 --memory-mb 1024 --kind microvm --headless --keep\n$RB rollout --prefix rmv- --n 64 --steps 20\n$RB rollout --prefix rmv- --n 96 --steps 20",
        "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."
        ],
        "sources": [],
        "status": "measured"
      }
    }
  ]
}
