Disk
Builds on Common Methodology
Measures uncached sequential and random read and write speed of the sandbox's disk with fio, using direct I/O (O_DIRECT).
When a coding agent or CI pipeline unpacks a multi-gigabyte container layer, compiles a large Rust or C++ workspace, queries a local SQLite or vector index, or writes build artifacts in /workspace, performance depends on the sandbox's underlying storage once the working set exceeds or bypasses the guest page cache.
The Disk tab measures uncached storage performance in /workspace/fio using fio with direct I/O (O_DIRECT) across four access patterns: Sequential Read and Sequential Write (1m blocks, reported in MiB/s for large streaming transfers), and Random Read and Random Write (4k blocks, reported in IOPS for small scattered operations).
View the Procedure View Disk Results Download Raw Data View the Parameters
Metrics
Sequential Read
Sequential Read is the sustained uncached 1 MiB sequential read throughput across the 1 GiB file /workspace/fio/data.bin using direct I/O (O_DIRECT), reported by fio (rw=read, bs=1m) in binary mebibytes per second (2^20 = 1,048,576 bytes/s).
Sequential Write
Sequential Write is the sustained uncached 1 MiB sequential write throughput to the 1 GiB file /workspace/fio/data.bin using direct I/O (O_DIRECT), reported by fio (rw=write, bs=1m).
Random Read
Random Read is the sustained uncached 4 KiB random read rate across the 1 GiB file /workspace/fio/data.bin using direct I/O (O_DIRECT), reported by fio (rw=randread, bs=4k).
Random Write
Random Write is the sustained uncached 4 KiB random write rate across the 1 GiB file /workspace/fio/data.bin using direct I/O (O_DIRECT), reported by fio (rw=randwrite, bs=4k).
| Timed Part | Starts | Ends |
| Sequential Read | fio starts after the untimed setup and the data file's first write, or the row before it. | fio exits after its 5 s ramp and 60 s measured interval, by the sandbox's own clock; its JSON is written to a file and read back, untimed, after. |
| Sequential Write | fio starts after the untimed setup and the data file's first write, or the row before it. | fio exits after its 5 s ramp and 60 s measured interval, by the sandbox's own clock; its JSON is written to a file and read back, untimed, after. |
| Random Read | fio starts after the untimed setup and the data file's first write, or the row before it. | fio exits after its 5 s ramp and 60 s measured interval, by the sandbox's own clock; its JSON is written to a file and read back, untimed, after. |
| Random Write | fio starts after the untimed setup and the data file's first write, or the row before it. | fio exits after its 5 s ramp and 60 s measured interval, by the sandbox's own clock; its JSON is written to a file and read back, untimed, after. |
\mathrm{BW}_{\mathrm{MiB/s},\,i} = \dfrac{B_i}{1{,}048{,}576}
-
\mathrm{BW}_{\mathrm{MiB/s},\,i} Binary megabytes per second in trial i (1 MiB = 2^20 bytes = 1,048,576 bytes). -
B_i The bytes per second fio reports over the 60 s measured interval in trial i.
After the 5 s ramp-up finishes, fio sums the bytes read or written across the 60 s measured window and reports bytes per second in its JSON output, which we divide by 1,048,576 (2^20) to report MiB/s for the sequential tests. For the random tests, fio counts completed 4 KiB read or write operations across the same window and reports iops directly.
Measurement
Each trial uses a sandbox created from BoxRouter's pinned standard image, running a static Linux x86_64 build of fio 3.39 (verified by SHA-256) with ioengine=libaio, direct=1, iodepth=64, and numjobs=1.
- Create sandbox and run readiness check.
- Record
/workspace/fio mount facts, verify O_DIRECT support and required free space, and pre-write the 1 GiB data.bin file. - Sequential Read Run the four
fio rows as polled background scripts in shuffled order, with fresh random buffers on every write. Timed - Run post-trial cache/compression checks and destroy sandbox.
Every buffer is filled with incompressible pseudo-random bytes so storage compression or deduplication cannot inflate throughput, with refill_buffers=1 and fsync=0 on write rows and uniformly distributed offsets on random rows.
The setup step checks for at least 2 GiB of free space in /workspace/fio, probes O_DIRECT with dd, and records memory usage before and after writing data.bin. The post-trial check runs a 256 MiB cached-versus-direct read probe and verifies that the first 64 MiB of data.bin has at least 99.9% of its 4 KiB blocks distinct and that zlib shrinks them by at most 1% (minimum ratio 0.99).
Scope Limits and Caveats
- Bypasses the guest OS page cache via
O_DIRECT to measure the storage path (so it does not reflect small cached file access); providers whose /workspace rejects O_DIRECT are not measured, such as Blaxel's default RAM filesystem. - Blaxel does not provision a disk for their sandboxes. They recommend using volumes, which are not measured by this test.
- The write rows rewrite an existing 1 GiB file with
O_DIRECT and fsync=0 (comparing rewrite speed against the initial file creation in a diagnostic check). - The random rows use a queue depth of 64 asynchronous requests (libaio) to measure storage IOPS ceilings rather than single-threaded synchronous time.
- Every trial records diagnostic checks, and a check that fires attaches a note to the provider's result stating how many trials triggered it, without removing any result.
- These tests measure sustained, high-queue-depth
O_DIRECT throughput and IOPS on a 1 GiB file, while everyday operations on small cached files are measured in Files and Filesystem. - Trials run concurrently per provider, up to 10 at once, so sandboxes in the batch can share host storage bandwidth when the provider places them on the same backing host.
Failures and Exclusions
Outcome classifications, top-up rounds, and outlier rules follow Common Methodology; the first failed step ends the trial without in-trial retries.
A sandbox whose /workspace rejects O_DIRECT reads or writes or has fewer than 2 GiB free is recorded as a missed trial, not a failure.
A trial fails as a provider error if fio exits non-zero or runs for less than 59 s of its 60 s measured window, and as a benchmark error if the fio binary digest mismatches or if fewer than 99.9% of the four-kilobyte blocks of data.bin are distinct or it compresses below 0.99.
Diagnostic checks record informational notes on the provider's result without excluding trials:
- when
/workspace sits on tmpfs or consumes at least 0.8 GiB of sandbox memory during initial file creation - when direct reads run at memory speed (within half of cached read speed or under ten microseconds median)
- when throughput drops by more than 30% between the first ten seconds and last ten seconds of the window
- when fewer than 90% of requests keep 64 I/Os in flight or
fio saturates more than 90% of a vCPU
| Step | Time Limit |
| Create | 5 min |
| Sequential Read | 3 min |
| Destroy | 5 min |
Statistics
- Based On
-
Common Methodology
Per-unit percentiles, bootstrap confidence intervals, and tail rules follow Common Methodology.
A provider is ranked once it has at least 20 successful trials.
Sandbox and Trials
- Image Digest
-
sha256
- Image Version
-
0.3.11
- Image Registry Page
-
View on the Registry
- Pull the Image
-
docker pull ghcr.io/boxrouter/standard-image@sha256:89d4c97048dbdfb8b6d85ad91833962ff38d1c334a5f47e6de80a9762310191b Copy
- Lifetime
-
30 min
- Idle Connection Time
-
5.0 min
From Common Methodology
- Idle Connection Exceptions
-
| Provider | Rule | File Transfer Idle Time |
| Daytona | The SDK has no idle-timeout setting. Its command channel keeps its connection open, and its file-transfer channel reconnects after 5 s of idle time. | 5.0 s |
From Common Methodology
- Network Path Attempts
-
10
From Common Methodology
- Mode
-
Single
- Sandboxes per Trial
-
1
- Parallel Trials
-
10
- Concurrent Sandboxes
-
1
At a Glance
- Metrics
-
- Sequential Read Bandwidth · Mebibytes per Second (MiB/s)
- Sequential Write Bandwidth · Mebibytes per Second (MiB/s)
- Random Read Operations · Input/Output Operations per Second (IOPS)
- Random Write Operations · Input/Output Operations per Second (IOPS)
- Direction
-
Higher Is Better
- Statistic
-
Median
- Clock
-
Sandbox clock
From Common Methodology
- Machine Size
-
2 vCPU / 4 GiB
- Trials
-
40