Benchmarks
pjdfstest
sandbox.exec in a LayerFS v1.0.0 Workspace, and again on the
kernel's own overlayfs as the reference.
LayerFS against kernel overlayfs
vs kernel overlayfs- LayerFS
- core at main e5c7aaae05, through the JS SDK
- Tool
- pjdfstest 85a8aea9 (classic C suite), as uid 501
- Reference
- kernel overlayfs, the same Sandbox's own /tmp (no FUSE)
- Host
- arm64 Mac · Docker Desktop, linux/arm64, 8 CPUs, 8.3 GB
- Load
- 6.3–15.8 (1 min)
Against the kernel reference
0 unexpected failures
all 275 direct LayerFS-only failures trace to 3 deliberate format limits
2,296 of 3,003
the rest meet a format limit
0 hangs
238 files, no crash, no lost data
As recorded: 707 assertions fail only on LayerFS, 275 directly and 432 as knock-on (a later check on a FIFO or socket that was never created). The four classes below hold 273 direct rows; the other 2 (chown/00.t #1199, #1262) are knock-ons of the FIFO limit the harness labels direct. Root-only cases fail on both arms as uid 501 and are not counted.
The limits pjdfstest meets, on purpose
A Workspace stores portable metadata (type, permission bits, mtime, content) so every Commit restores the same on any host. pjdfstest probes outside that, in four places:
FIFO and UNIX socket nodes
214 directmkfifo, mknod … f, bind: LayerFS EPERM, kernel overlayfs 0
Three node types · Regular files, directories and symlinks. FIFO, socket and device nodes are refused (EPERM).
The canonical format has regular files, directories and symlinks only. layerfs-fuse/src/operations/unsupported.rs
Set-id and sticky bits for the owner
37 directcreate 04777, chmod 06555, chmod 01700: LayerFS EPERM, kernel overlayfs 0
Portable mode bits · 0o777 on files, 0o1777 on directories. Set-id bits, and sticky on files, are refused; the mount is nosuid.
Only portable mode values are stored, so a Commit restores the same bits on any host. layerfs-content/src/filesystem/attributes/portable.rs
atime kept apart from mtime
16 directutimensat, then lstat atime: LayerFS atime = mtime, kernel overlayfs as set
One stored time · mtime is stored; atime, ctime and birth time are reported as it. The mount is noatime.
mtime is the only time in the portable metadata; reads never write it. layerfs-fuse/src/attributes.rs
ctime on chmod, link, unlink, rename
6 directchmod, link, unlink of another link, rename onto a linked target: LayerFS unchanged, kernel overlayfs +1 s
One stored time · mtime is stored; atime, ctime and birth time are reported as it. The mount is noatime.
mtime is the only time in the portable metadata; reads never write it. layerfs-fuse/src/attributes.rs
Assertions passed, by test directory
Both arms on one scale. Most of each directory is root-only and fails on both; the gaps sit where the limits above apply (mkfifo, mknod, chmod, utimensat).
- chmod135 / 199 of 327
- chown280 / 425 of 1,497
- ftruncate71 / 71 of 89
- link162 / 225 of 359
- mkdir69 / 77 of 118
- mkfifo42 / 84 of 120
- mknod56 / 106 of 186
- open113 / 133 of 337
- rename1,106 / 1,207 of 4,857
- rmdir77 / 83 of 145
- symlink72 / 76 of 95
- truncate68 / 68 of 84
- unlink124 / 154 of 440
- utimensat69 / 95 of 122
Read with care
Never root
sandbox.exec runs as uid 501 and the classic suite expects root, so most of both arms fails. Only assertions that fail on LayerFS and pass on the reference are counted.
Knock-on is a heuristic
A failure after an earlier one in the same file is labelled knock-on by the harness, not proven; the direct failures are each reproduced.
The reverse also happens
141 assertions fail only on the reference, because they check a node LayerFS never created.
This host
Docker Desktop on an arm64 Mac, LayerFS at main e5c7aaae05, pjdfstest 85a8aea9, one run per arm.
Data: benchmark/data/pjdfstest/v1.0.0/ in the LayerFS repository (per file, per directory, every LayerFS-only assertion, receipts with every TAP log, and the run record).