self-host →

RunsOn r8a.xlarge · tmpfs vs Namespace 4x16 x64

RunsOn does the Rust and TypeScript builds for 3.0–3.2× less; on time, Namespace is faster on the Rust build and tied on the TypeScript build. Both 4 vCPU x64.

Price per minute 5.7× cheaper on RunsOn: $0.0021 vs $0.0120the builds are not all compared on cost yet
Rust build 3.2× cheaper on RunsOn: $0.0065 vs $0.0208Namespace 1.3× faster: 1m 38s vs 2m 06s
TypeScript build 3.0× cheaper on RunsOn: $0.0036 vs $0.0108about the same time: 48s · 47s
Docker build 5m 01s Namespace only · RunsOn not run

Side by side

Every measurement both runners share, cost first. The dot marks the better value; gap is the larger over the smaller.

Measurement RunsOn Namespace Gap
Cost
Cost per Rust build $0.0065 $0.0208 3.2× RunsOn
Cost per TypeScript build $0.0036 $0.0108 3.0× RunsOn
Cost per Docker build n/a: Not run: needs more than 32 GB of RAM with tmpfs, where Docker's data root lives in RAM; PostHog's layers plus the build's own memory exceeded it and the runner was shut down mid-build. The 64 GB tmpfs runner builds it. $0.0650 —
Price per minute $0.0021 $0.0120 overage rate 5.7× RunsOn
Real builds, wall time
Rust build (spotify-⁠player) 2m 06s 1m 38s 1.3× Namespace
TypeScript build (opencode) 48s 47s ≈ even
Docker build (PostHog) n/a: Not run: needs more than 32 GB of RAM with tmpfs, where Docker's data root lives in RAM; PostHog's layers plus the build's own memory exceeded it and the runner was shut down mid-build. The 64 GB tmpfs runner builds it. 5m 01s —
CPU & memory
PassMark single-⁠thread (points) 3,799 4,700 1.2× Namespace
PassMark CPU Mark, all cores (points) 13,460 16,176 1.2× Namespace
sysbench CPU, 1 thread (events/s) 5,534 7,051 1.3× Namespace
7-⁠Zip compression (MIPS) 28,331 33,428 1.2× Namespace
Memory read bandwidth 36.5 GiB/s 44.8 GiB/s 1.2× Namespace
Measurement RunsOn Namespace Gap
Workspace disk (fio)
Random read, 4k QD32 (IOPS) 4,014,510 1,011,926 4.0× RunsOn
Random write, 4k QD32 (IOPS) 3,665,859 436,056 8.4× RunsOn
Random read, 4k QD1 (IOPS) 1,054,041 78,615 13.4× RunsOn
QD1 read latency, p99 <1 µs 12 µs 61.0× RunsOn
Sequential read 18.2 GiB/s 4.1 GiB/s 4.4× RunsOn
Sequential write 9.9 GiB/s 2.9 GiB/s 3.4× RunsOn
Sync write, 4k + fdatasync (IOPS) 912,188 17,844 51.1× RunsOn
Network, cache & Docker
Download from GitHub 330 MiB/s 202 MiB/s 1.6× RunsOn
Cache restore, 4 GB (actions/cache) 8s 28s 3.5× RunsOn
Cache save, 4 GB (actions/cache) 13s 14s 1.1× RunsOn
docker pull 5.1s 4.2s 1.2× Namespace
Database
pgbench read/write (TPS) 20,139 8,463 2.4× RunsOn
pgbench read-⁠only (TPS) 147,043 67,294 2.2× RunsOn
Queue
Queue under burst load 17s 2m 23s plan limit —
  • ≈ even: under 5% apart, or a build inside both runners' run-to-run spread
  • Queue: identical jobs queued at the same instant (burst suite)
  • 2 missing on one side or both
  • Queue: not compared. Namespace's burst ran 4 jobs at a time, the concurrency limit of the plan this benchmark account is on
  • RunsOn at EC2 spot, its default (7-day average of the cheapest us-east-1 zone's spot price, fetched 5 Oct 2026); the jobs ran on spot
  • Cost: a managed SaaS runner against RunsOn self-hosted on your AWS account; the effort of running it was not measured

Other head-to-heads