# How fast do files move into and out of a Space?

Uploading one 100 MiB file into a running QEMU Linux VM Space ran at 625.7 MiB/s and downloading it at 873.3 MiB/s (p50 time, n = 10) on a Mac Studio (Apple M2 Max, 96 GB), measured 2026-10-25 on Cua Spaces 0.15.0.

- Page: https://cua.ai/benchmarks/file-transfer-throughput
- Measured: 2026-10-25
- Raw data: https://cua.ai/benchmarks/file-transfer-throughput.csv
- 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 = 10

## Results

Throughput at the p50 time, one file per transfer, from the same Mac. Higher is better.

| Measure | Value |
| --- | --- |
| Upload 1 MiB | 211.1 MiB/s |
| Upload 16 MiB | 509.9 MiB/s |
| Upload 100 MiB | 625.7 MiB/s |
| Upload 512 MiB | 619.3 MiB/s |
| Download 1 MiB | 148.8 MiB/s |
| Download 16 MiB | 549.2 MiB/s |
| Download 100 MiB | 873.3 MiB/s |
| Download 512 MiB | 1,164 MiB/s |

## Method

Driver on the host: `bench/channel/run.sh` from tag cua-spaces-v0.15.0 with `channel_bench` (Rust SDK example built from the tag). It creates one Linux VM Space on this Mac (`cua spaces create linux --on local --kind vm --cpus 2 --memory-mb 2048`, QEMU on HVF), measures it through the SDK and deletes it. Route: `local 127.0.0.1` (gRPC to the Space's cua-spacesd). Exec: 300 serial round trips each of a no-op RPC, `true` run directly, and `sh -c` (5 warm-up calls excluded). Files: one file per transfer of 1 MiB (n=20), 4 MiB (20), 16 MiB (10), 100 MiB (10), 512 MiB (5), upload then download, MiB/s = size / p50 time; files of 2 MiB and more use the VM's bulk lane (a shared disk, SHA-256 checked). channel_bench writes percentiles per metric, not per sample, so samples.csv holds one row per metric.

## Environment

- Machine: Mac Studio, Mac14,13 (Mac Studio)
- Chip: Apple M2 Max, 12 cores
- Memory: 96 GB
- OS: macOS 26.6.2 (25G83)
- Where: local
- Other vms: 1
- Network: n/a (local)
- Kind: vm
- Image: linux (catalog alias, full Linux VM disk)
- Shape: 2 vCPU, 2 GiB
- 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

- Same machine (loopback): a client on another machine adds its network.
- Files of 2 MiB and more use the VM's bulk lane, a shared disk; every transfer is SHA-256 checked.
- samples.csv has one row per metric (percentiles), not one per sample.

## Reproduce

```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 daemon start --foreground &
cd ~/bench/cua/libs/cua
CUA=cua BENCH=target/release/examples/channel_bench FILES=1:20,4:20,16:10,100:10,512:5 OUT=results \
  bash bench/channel/run.sh bench/channel/baselines/macos-m2max-qemu.json
```

## Questions

### Why are small files slower?

Per-transfer overhead dominates a 1 MiB file. From 2 MiB on, files go through the VM's bulk lane (a shared disk), which is where the throughput rises.

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