Benchmarks
fsstress
sandbox.exec in a LayerFS v1.0.0 Workspace and on the Sandbox's
own disk, then commit the Workspace, mount that Commit again and compare every entry.
LayerFS against kernel overlayfs
vs kernel overlayfs- LayerFS
- core at main e5c7aaae05, through the JS SDK
- Tool
- xfstests ltp/fsstress at 22348afe338c
- Reference
- kernel overlayfs, the same Sandbox's own /tmp (no FUSE)
- Host
- arm64 Mac · Docker Desktop, linux/arm64, 8 CPUs, 8.3 GB
- Load
- 5.9–6.7 (1 min)
Capture proof
3,755 / 3,755 IDENTICAL
every entry after 4 × 10,000 concurrent ops: path, type, mode, size, SHA-256, symlink target, links
5.21 GB of file bytes captured
4.85 s
5.21 GB logical · 1.28 MB newly stored
The stress runs
Every run finished with exit 0 on both arms. Errors count every refused call, including root-only and XFS-only ones that hit both arms.
Op by op
Share of attempted calls that succeeded, concurrent case c2. 42 of 61 operation kinds behaved alike on both arms (within five points); these 19 did not. deduperange is left out: the reference returned success but deduplicated nothing.
- fallocate()0%100%
- fallocate(COLLAPSE_RANGE)0%20%
- fallocate(INSERT_RANGE)0%27%
- fallocate(KEEP_SIZE)0%100%
- fallocate(KEEP_SIZE|PUNCH_HOLE)0%100%
- fallocate(KEEP_SIZE|ZERO_RANGE)0%100%
- fallocate(ZERO_RANGE)0%100%
- getattr0%52%
- getfattr0%21%
- ioctl(FIEMAP)0%51%
- link68%100%
- listfattr0%100%
- removefattr0%18%
- rename(EXCHANGE)1%100%
- rmdir16%10%
- setfattr0%98%
- setxattr0%6%
- xfsctl(XFS_IOC_RESVSP64)0%100%
- xfsctl(XFS_IOC_UNRESVSP64)0%100%
Outside the format, by design
The calls only LayerFS refused, each reproduced with a standard tool and each a limit LayerFS keeps on purpose. fsstress keeps going past a refused call, so none of them broke a run or the capture.
How it ran
Only through the JS SDK
- project.init(a seed folder)the Store
- sandbox.create("bench", image)fsstress built in
- branch.fork("bench", "main")its own Branch
- sandbox.mount("bench", "bench")/workspaces/1
- sandbox.exec(fsstress, manifest)both arms
- sandbox.commit(after c2)the whole Workspace
- branch.fork("capture", Commit id)a Branch at that Commit
- sandbox.mount("bench", "capture")/workspaces/2, manifest again
Not identical work
A refused call returns early and later ops pick different files, so the arms do different work. Compare them op by op, not by wall time.
One sample each
Seeds fixed, each case once per arm. Host load 5.94-6.24 (1 min) during the cases.
Not counted
deduperange (the reference deduplicated nothing either), and root-only or XFS-only calls that fail on both arms.
This host
Docker Desktop on an arm64 Mac, LayerFS at main e5c7aaae05, Disposable Store.
Data: benchmark/data/fsstress/v1.0.0/ in the LayerFS repository (runs, per-op outcomes, capture, environment, receipts and the run record).