yolo-bench — c6525-25g @ utah.cloudlab.us

cloudlabc6525-25g @ utah.cloudlab.us
hostnode0.ljx-295304.advosuwmadison-pg0.utah.cloudlab.us
cpuAMD EPYC 7302P 16-Core Processor
memory125 GB
storageMTFDDAK480TDN — SSD (/dev/sda3)
filesystemext4 — 294 GB total, 236 GB free
kernel6.8.0-106-generic
distroUbuntu 24.04.4 LTS
repoc2c43b (user: clean, kmod: clean)
dataresults.json

Per-op Micro-benchmark: Big File Data Operations

fio-seq-read-cold — Sequential 4K read, 1 GB file, cold page cache (fio)
stale (5) 0d3b84
why
  • yolo-no-perm: user/ or kmod/ changed between ce8faa and c2c43b
  • branchfs: user/ or kmod/ changed between ce8faa and c2c43b
  • overlayfs: user/ or kmod/ changed between ce8faa and c2c43b
  • native: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ce8faa and c2c43b
details

Summary: Sequential buffered read benchmark with cold page cache.

Fixture: The workload creates `<dest>/testfile.dat` inside the mounted sandbox as a 1 GiB deterministic patterned file before running fio.

Harness: Harness behavior: create the sandbox-local backing file before the timed run, then have the parent/backend drop page cache before fio starts.

Execution: Command:
fio --output-format=json <dest>/job.fio

Jobfile:

[fio-seq-read-cold]
filename=<dest>/testfile.dat
rw=read
bs=4k
filesize=1g
io_size=256m
direct=0
invalidate=0
ioengine=psync

Source: src/workloads/fio_seq_read_cold.rs

fio-seq-read-warm — Sequential 4K read, 1 GB file, warm page cache (fio)
stale (5) 0d3b84
why
  • yolo-no-perm: user/ or kmod/ changed between ce8faa and c2c43b
  • overlayfs: user/ or kmod/ changed between ce8faa and c2c43b
  • branchfs: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ce8faa and c2c43b
  • native: user/ or kmod/ changed between ce8faa and c2c43b
details

Summary: Sequential buffered read benchmark with warm page cache.

Fixture: The workload creates `<dest>/testfile.dat` inside the mounted sandbox as a 1 GiB deterministic patterned file before running fio.

Harness: Harness behavior: pre-read `<dest>/testfile.dat` once before launching fio to warm the page cache.

Execution: Command:
fio --output-format=json <dest>/job.fio

Jobfile:

[fio-seq-read-warm]
filename=<dest>/testfile.dat
rw=read
bs=4k
filesize=1g
io_size=1g
direct=0
invalidate=0
ioengine=psync

Source: src/workloads/fio_seq_read_warm.rs

fio-seq-write — Sequential 4K write, 1 GB file (fio)
stale (5) 0d3b84
why
  • yolo-no-perm: user/ or kmod/ changed between ce8faa and c2c43b
  • overlayfs: user/ or kmod/ changed between ce8faa and c2c43b
  • branchfs: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ce8faa and c2c43b
  • native: user/ or kmod/ changed between ce8faa and c2c43b
details

Summary: Sequential buffered write benchmark over a 1 GiB logical file space.

Fixture: No pre-existing file is required; fio creates `<dest>/testfile.dat` inside the workload directory.

Harness: Harness behavior: no extra cold/warm cache preparation is applied.

Execution: Command:
fio --output-format=json <dest>/job.fio

Jobfile:

[fio-seq-write]
filename=<dest>/testfile.dat
rw=write
bs=4k
filesize=1g
io_size=256m
direct=0
invalidate=0
ioengine=psync

Source: src/workloads/fio_seq_write.rs

fio-rand-read-cold — Random 4K read, 1 GB file, cold page cache (fio)
stale (5) 0d3b84
why
  • yolo-no-perm: user/ or kmod/ changed between ce8faa and c2c43b
  • branchfs: user/ or kmod/ changed between ce8faa and c2c43b
  • overlayfs: user/ or kmod/ changed between ce8faa and c2c43b
  • native: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ce8faa and c2c43b
details

Summary: Random buffered read benchmark with cold page cache.

Fixture: The workload creates `<dest>/testfile.dat` inside the mounted sandbox as a 1 GiB deterministic patterned file before running fio.

Harness: Harness behavior: create the sandbox-local backing file before the timed run, then have the parent/backend drop page cache before fio starts.

Execution: Command:
fio --output-format=json <dest>/job.fio

Jobfile:

[fio-rand-read-cold]
filename=<dest>/testfile.dat
rw=randread
bs=4k
filesize=1g
io_size=256m
direct=0
invalidate=0
ioengine=psync

Source: src/workloads/fio_rand_read_cold.rs

fio-rand-read-warm — Random 4K read, 1 GB file, warm page cache (fio)
stale (5) 0d3b84
why
  • yolo-no-perm: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ce8faa and c2c43b
  • overlayfs: user/ or kmod/ changed between ce8faa and c2c43b
  • branchfs: user/ or kmod/ changed between ce8faa and c2c43b
  • native: user/ or kmod/ changed between ce8faa and c2c43b
details

Summary: Random buffered read benchmark with warm page cache.

Fixture: The workload creates `<dest>/testfile.dat` inside the mounted sandbox as a 1 GiB deterministic patterned file before running fio.

Harness: Harness behavior: pre-read `<dest>/testfile.dat` once before launching fio to warm the page cache.

Execution: Command:
fio --output-format=json <dest>/job.fio

Jobfile:

[fio-rand-read-warm]
filename=<dest>/testfile.dat
rw=randread
bs=4k
filesize=1g
io_size=1g
direct=0
invalidate=0
ioengine=psync

Source: src/workloads/fio_rand_read_warm.rs

fio-rand-write — Random 4K write, 1 GB file (fio)
stale (5) 0d3b84
why
  • yolo-no-perm: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ce8faa and c2c43b
  • overlayfs: user/ or kmod/ changed between ce8faa and c2c43b
  • branchfs: user/ or kmod/ changed between ce8faa and c2c43b
  • native: user/ or kmod/ changed between ce8faa and c2c43b
details

Summary: Random buffered write benchmark over a 1 GiB logical file space.

Fixture: No pre-existing file is required; fio creates `<dest>/testfile.dat` inside the workload directory.

Harness: Harness behavior: no extra cold/warm cache preparation is applied.

Execution: Command:
fio --output-format=json <dest>/job.fio

Jobfile:

[fio-rand-write]
filename=<dest>/testfile.dat
rw=randwrite
bs=4k
filesize=1g
io_size=256m
direct=0
invalidate=0
ioengine=psync

Source: src/workloads/fio_rand_write.rs

fio-randrw-cold — Random 4K 70/30 read/write mix, 1 GB file, cold page cache (fio)
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ce8faa and c2c43b
  • overlayfs: user/ or kmod/ changed between ce8faa and c2c43b
  • branchfs: user/ or kmod/ changed between ce8faa and c2c43b
details

Summary: Mixed random buffered benchmark with cold page cache.

Fixture: The workload creates `<dest>/testfile.dat` inside the mounted sandbox as a 1 GiB deterministic patterned file before running fio.

Harness: Harness behavior: create the sandbox-local backing file before the timed run, then have the parent/backend drop page cache before fio starts.

Execution: Command:
fio --output-format=json <dest>/job.fio

Jobfile:

[fio-randrw-cold]
filename=<dest>/testfile.dat
rw=randrw
bs=4k
filesize=1g
io_size=256m
direct=0
invalidate=0
ioengine=psync
rwmixread=70

Source: src/workloads/fio_randrw_cold.rs

fio-randrw-warm — Random 4K 70/30 read/write mix, 1 GB file, warm page cache (fio)
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between ce8faa and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ce8faa and c2c43b
  • overlayfs: user/ or kmod/ changed between ce8faa and c2c43b
  • branchfs: user/ or kmod/ changed between ce8faa and c2c43b
details

Summary: Mixed random buffered benchmark with warm page cache.

Fixture: The workload creates `<dest>/testfile.dat` inside the mounted sandbox as a 1 GiB deterministic patterned file before running fio.

Harness: Harness behavior: pre-read `<dest>/testfile.dat` once before launching fio to warm the page cache.

Execution: Command:
fio --output-format=json <dest>/job.fio

Jobfile:

[fio-randrw-warm]
filename=<dest>/testfile.dat
rw=randrw
bs=4k
filesize=1g
io_size=1g
direct=0
invalidate=0
ioengine=psync
rwmixread=70

Source: src/workloads/fio_randrw_warm.rs

Per-op Micro-benchmark: Small File Metadata Operations

meta-create — Create 10,000 empty files (large directory)
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Op benchmark for file creation throughput and latency.

Fixture: No pre-existing files required. The work directory is created on demand inside the mounted session.

Execution: Rust code:

for i in 0..count {
    let t0 = Instant::now();
    File::create(dest.join(format!("f-{i:06}.dat")))?;
    latencies.push(t0.elapsed());
}

Source: src/workloads/meta_create.rs

meta-create-100 — Create 100 empty files (small directory)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Op benchmark for file creation throughput and latency.

Fixture: No pre-existing files required. The work directory is created on demand inside the mounted session.

Execution: Rust code:

for i in 0..count {
    let t0 = Instant::now();
    File::create(dest.join(format!("f-{i:06}.dat")))?;
    latencies.push(t0.elapsed());
}

Source: src/workloads/meta_create.rs

meta-create-100k — Create 100,000 empty files (stress directory)
stale (5) 23e98e
why
  • native: user/ or kmod/ changed between 23e98e and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 23e98e and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 23e98e and c2c43b
  • overlayfs: user/ or kmod/ changed between 23e98e and c2c43b
  • branchfs: user/ or kmod/ changed between 23e98e and c2c43b
details

Summary: Op benchmark for file creation throughput and latency.

Fixture: No pre-existing files required. The work directory is created on demand inside the mounted session.

Execution: Rust code:

for i in 0..count {
    let t0 = Instant::now();
    File::create(dest.join(format!("f-{i:06}.dat")))?;
    latencies.push(t0.elapsed());
}

Source: src/workloads/meta_create.rs

meta-append — Append 4 KiB to 10,000 base-layer files (large dir)
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Append 4 KiB to each of 10,000 pre-existing files, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let buf = vec![0xAB; workloads::OP_FILE_SIZE]; let mut latencies =
    Vec::with_capacity(count); for i in 0..count
    {
        let path = dest.join(format!("file-{i:06}.dat")); let t0 =
        Instant::now();
        std::fs::OpenOptions::new().append(true).open(&path).with_context(||
        format!("opening {}", path.display()))?
        .write_all(&buf).with_context(||
        format!("appending {}", path.display()))?;
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_append.rs

meta-append-100 — Append 4 KiB to 100 base-layer files (small dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Append 4 KiB to each of 10,000 pre-existing files, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let buf = vec![0xAB; workloads::OP_FILE_SIZE]; let mut latencies =
    Vec::with_capacity(count); for i in 0..count
    {
        let path = dest.join(format!("file-{i:06}.dat")); let t0 =
        Instant::now();
        std::fs::OpenOptions::new().append(true).open(&path).with_context(||
        format!("opening {}", path.display()))?
        .write_all(&buf).with_context(||
        format!("appending {}", path.display()))?;
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_append.rs

meta-open — Warm open over 10,000 base-layer files (large dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Open 10,000 files from warm dcache/icache, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let mut latencies = Vec::with_capacity(count); for i in 0..count
    {
        let path = dest.join(format!("file-{i:06}.dat")); let t0 =
        Instant::now(); let f =
        std::fs::File::open(&path).with_context(||
        format!("open {}", path.display()))?; std::hint::black_box(f);
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_open_warm.rs

meta-open-100 — Warm open over 100 base-layer files (small dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Open 10,000 files from warm dcache/icache, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let mut latencies = Vec::with_capacity(count); for i in 0..count
    {
        let path = dest.join(format!("file-{i:06}.dat")); let t0 =
        Instant::now(); let f =
        std::fs::File::open(&path).with_context(||
        format!("open {}", path.display()))?; std::hint::black_box(f);
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_open_warm.rs

meta-stat — Warm stat over 10,000 base-layer files (large dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Stat 10,000 files from warm dcache/icache, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let mut latencies = Vec::with_capacity(count); for i in 0..count
    {
        let path = dest.join(format!("file-{i:06}.dat")); let t0 =
        Instant::now(); let meta =
        std::fs::metadata(&path).with_context(||
        format!("stat {}", path.display()))?; std::hint::black_box(meta);
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_stat_warm.rs

meta-stat-100 — Warm stat over 100 base-layer files (small dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Stat 10,000 files from warm dcache/icache, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let mut latencies = Vec::with_capacity(count); for i in 0..count
    {
        let path = dest.join(format!("file-{i:06}.dat")); let t0 =
        Instant::now(); let meta =
        std::fs::metadata(&path).with_context(||
        format!("stat {}", path.display()))?; std::hint::black_box(meta);
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_stat_warm.rs

meta-readdir — Warm readdir over one base-layer directory with 10,000 files (large dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Enumerate one warm directory containing 100 or 10,000 files, measuring per-readdir latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let t0 = Instant::now(); let mut count = 0usize; for entry in
    std::fs::read_dir(dest).with_context(||
    format!("reading {}", dest.display()))?
    {
        let entry =
        entry.with_context(|| format!("iterating {}", dest.display()))?;
        std::hint::black_box(entry.file_name()); count += 1;
    } if count != expected
    {
        bail!("expected {expected} entries in {}, found {count}",
        dest.display());
    } Ok(vec![t0.elapsed()])
}

Source: src/workloads/meta_readdir_warm.rs

meta-readdir-100 — Warm readdir over one base-layer directory with 100 files (small dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Enumerate one warm directory containing 100 or 10,000 files, measuring per-readdir latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let t0 = Instant::now(); let mut count = 0usize; for entry in
    std::fs::read_dir(dest).with_context(||
    format!("reading {}", dest.display()))?
    {
        let entry =
        entry.with_context(|| format!("iterating {}", dest.display()))?;
        std::hint::black_box(entry.file_name()); count += 1;
    } if count != expected
    {
        bail!("expected {expected} entries in {}, found {count}",
        dest.display());
    } Ok(vec![t0.elapsed()])
}

Source: src/workloads/meta_readdir_warm.rs

meta-rename — Rename 10,000 base-layer files (large dir)
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Rename 10,000 files, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let mut latencies = Vec::with_capacity(count); for i in 0..count
    {
        let from = dest.join(format!("file-{i:06}.dat")); let to =
        dest.join(format!("renamed-{i:06}.dat")); let t0 = Instant::now();
        std::fs::rename(&from,
        &to).with_context(||
        format!("renaming {} -> {}", from.display(), to.display()))?;
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_rename.rs

meta-rename-100 — Rename 100 base-layer files (small dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Rename 10,000 files, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let mut latencies = Vec::with_capacity(count); for i in 0..count
    {
        let from = dest.join(format!("file-{i:06}.dat")); let to =
        dest.join(format!("renamed-{i:06}.dat")); let t0 = Instant::now();
        std::fs::rename(&from,
        &to).with_context(||
        format!("renaming {} -> {}", from.display(), to.display()))?;
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_rename.rs

meta-unlink — Unlink 10,000 base-layer files (large dir)
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Delete 10,000 files, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let mut latencies = Vec::with_capacity(count); for i in 0..count
    {
        let path = dest.join(format!("file-{i:06}.dat")); let t0 =
        Instant::now();
        std::fs::remove_file(&path).with_context(||
        format!("unlinking {}", path.display()))?;
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_unlink.rs

meta-unlink-100 — Unlink 100 base-layer files (small dir)
stale (5) 531d9c
why
  • native: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 531d9c and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 531d9c and c2c43b
  • overlayfs: user/ or kmod/ changed between 531d9c and c2c43b
  • branchfs: user/ or kmod/ changed between 531d9c and c2c43b
details

Summary: Delete 10,000 files, measuring per-operation latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Execution: Rust code:

{
    let mut latencies = Vec::with_capacity(count); for i in 0..count
    {
        let path = dest.join(format!("file-{i:06}.dat")); let t0 =
        Instant::now();
        std::fs::remove_file(&path).with_context(||
        format!("unlinking {}", path.display()))?;
        latencies.push(t0.elapsed());
    } Ok(latencies)
}

Source: src/workloads/meta_unlink.rs

meta-create-10
stale (5) ddbc75
why
  • native: user/ or kmod/ changed between ddbc75 and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between ddbc75 and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ddbc75 and c2c43b
  • branchfs: user/ or kmod/ changed between ddbc75 and c2c43b
  • overlayfs: user/ or kmod/ changed between 6e4838 and c2c43b
Per-op Micro-benchmark: Small File Metadata Operations (Cold Cache)

meta-open-cold — One cold open against a 10,000-file base-layer fixture
stale (5) b56238
why
  • native: user/ or kmod/ changed between b56238 and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between b56238 and c2c43b
  • yolo-realistic: user/ or kmod/ changed between b56238 and c2c43b
  • overlayfs: user/ or kmod/ changed between b56238 and c2c43b
  • branchfs: user/ or kmod/ changed between b56238 and c2c43b
details

Summary: One open syscall after dropping page caches, measuring cold path lookup/open latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Harness: Page cache is dropped after all subprocess setup but before the timed open.

Execution: Rust code:

{
    let path = dest.join(COLD_DATA_SUBDIR).join("file-000000.dat"); let t0 =
    Instant::now(); let f =
    std::fs::File::open(&path).with_context(||
    format!("open {}", path.display()))?; std::hint::black_box(f);
    Ok(vec![t0.elapsed()])
}

Source: src/workloads/meta_open_cold.rs

meta-stat-cold — One cold stat against a 10,000-file base-layer fixture
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between b56238 and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between b56238 and c2c43b
  • yolo-realistic: user/ or kmod/ changed between b56238 and c2c43b
  • overlayfs: user/ or kmod/ changed between b56238 and c2c43b
  • branchfs: user/ or kmod/ changed between b56238 and c2c43b
details

Summary: One stat syscall after dropping page caches, measuring cold metadata lookup latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Harness: Page cache is dropped after all subprocess setup but before the timed stat.

Execution: Rust code:

{
    let path = dest.join(COLD_DATA_SUBDIR).join("file-000000.dat"); let t0 =
    Instant::now(); let meta =
    std::fs::metadata(&path).with_context(||
    format!("stat {}", path.display()))?; std::hint::black_box(meta);
    Ok(vec![t0.elapsed()])
}

Source: src/workloads/meta_stat_cold.rs

meta-readdir-cold — One cold readdir over one base-layer directory with 10,000 files
stale (5) 0d3b84
why
  • native: user/ or kmod/ changed between b56238 and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between b56238 and c2c43b
  • yolo-realistic: user/ or kmod/ changed between b56238 and c2c43b
  • overlayfs: user/ or kmod/ changed between b56238 and c2c43b
  • branchfs: user/ or kmod/ changed between b56238 and c2c43b
details

Summary: One readdir syscall after dropping page caches, measuring cold directory enumeration latency.

Fixture: Fixture varies by source: base populates before mount; stage creates inside the mount; checkpoint snapshots after creation.

Harness: Page cache is dropped after all subprocess setup but before the timed readdir.

Execution: Rust code:

{
    let subdir = dest.join(COLD_DATA_SUBDIR); let t0 = Instant::now(); let mut
    count = 0usize; for entry in
    std::fs::read_dir(&subdir).with_context(||
    format!("reading {}", subdir.display()))?
    {
        let entry =
        entry.with_context(|| format!("iterating {}", subdir.display()))?;
        std::hint::black_box(entry.file_name()); count += 1;
    } if count != expected
    {
        bail!("expected {expected} entries in {}, found {count}",
        subdir.display());
    } Ok(vec![t0.elapsed()])
}

Source: src/workloads/meta_readdir_cold.rs

Session Micro-benchmark (init/run/commit)

write-files — Create 10,000 new 4 KiB files
stale (10) 39d2f9
why
  • native: user/ or kmod/ changed between 2ecc15 and c2c43b
  • native: user/ was dirty and is now clean
  • yolo-no-perm: user/ or kmod/ changed between 2ecc15 and c2c43b
  • yolo-no-perm: user/ was dirty and is now clean
  • yolo-realistic: user/ or kmod/ changed between 2ecc15 and c2c43b
  • yolo-realistic: user/ was dirty and is now clean
  • overlayfs: user/ or kmod/ changed between 2ecc15 and c2c43b
  • overlayfs: user/ was dirty and is now clean
  • branchfs: user/ or kmod/ changed between 2ecc15 and c2c43b
  • branchfs: user/ was dirty and is now clean
details

Summary: Session microbenchmark that creates N new 4 KiB files to exercise create + write behavior through each backend.

Fixture: No external fixture. The workload runs in a fresh work directory created inside the backend session.

Execution: Rust code:

let buf = vec![0u8; 4096];
for i in 0..count {
    fs::write(dest.join(format!("file-{i:06}.dat")), &buf)?;
}

Source: src/workloads/write_files.rs

overwrite-files — Overwrite 10,000 pre-existing 4 KiB files (COW path)
stale (10) 39d2f9
why
  • native: user/ or kmod/ changed between 2ecc15 and c2c43b
  • native: user/ was dirty and is now clean
  • yolo-no-perm: user/ or kmod/ changed between 2ecc15 and c2c43b
  • yolo-no-perm: user/ was dirty and is now clean
  • yolo-realistic: user/ or kmod/ changed between 2ecc15 and c2c43b
  • yolo-realistic: user/ was dirty and is now clean
  • overlayfs: user/ or kmod/ changed between 2ecc15 and c2c43b
  • overlayfs: user/ was dirty and is now clean
  • branchfs: user/ or kmod/ changed between 2ecc15 and c2c43b
  • branchfs: user/ was dirty and is now clean
details

Summary: Session microbenchmark for copy-on-write / copy-up behavior on existing files.

Fixture: Populates the backend base layer with N 4 KiB files before timing so each write targets an existing file.

Execution: Rust code:

let buf = vec![0xFFu8; 4096];
for i in 0..count {
    fs::write(dest.join(format!("file-{i:06}.dat")), &buf)?;
}

Source: src/workloads/overwrite_files.rs

rename-files — Rename 10,000 pre-existing files
stale (10) 39d2f9
why
  • native: user/ or kmod/ changed between 2ecc15 and c2c43b
  • native: user/ was dirty and is now clean
  • yolo-no-perm: user/ or kmod/ changed between 2ecc15 and c2c43b
  • yolo-no-perm: user/ was dirty and is now clean
  • yolo-realistic: user/ or kmod/ changed between 2ecc15 and c2c43b
  • yolo-realistic: user/ was dirty and is now clean
  • overlayfs: user/ or kmod/ changed between 2ecc15 and c2c43b
  • overlayfs: user/ was dirty and is now clean
  • branchfs: user/ or kmod/ changed between 2ecc15 and c2c43b
  • branchfs: user/ was dirty and is now clean
details

Summary: Session microbenchmark for rename-heavy directory operations on existing files.

Fixture: Populates the backend base layer with N 4 KiB files before timing.

Execution: Rust code:

for i in 0..count {
    fs::rename(
        dest.join(format!("file-{i:06}.dat")),
        dest.join(format!("renamed-{i:06}.dat")),
    )?;
}

Source: src/workloads/rename_files.rs

unlink-files — Delete 10,000 pre-existing files
stale (10) 2ecc15
why
  • native: user/ or kmod/ changed between 2ecc15 and c2c43b
  • native: user/ was dirty and is now clean
  • yolo-no-perm: user/ or kmod/ changed between 2ecc15 and c2c43b
  • yolo-no-perm: user/ was dirty and is now clean
  • yolo-realistic: user/ or kmod/ changed between 2ecc15 and c2c43b
  • yolo-realistic: user/ was dirty and is now clean
  • overlayfs: user/ or kmod/ changed between 2ecc15 and c2c43b
  • overlayfs: user/ was dirty and is now clean
  • branchfs: user/ or kmod/ changed between 2ecc15 and c2c43b
  • branchfs: user/ was dirty and is now clean
details

Summary: Session microbenchmark for delete-heavy operations on existing files.

Fixture: Populates the backend base layer with N 4 KiB files before timing.

Execution: Rust code:

for i in 0..count {
    fs::remove_file(dest.join(format!("file-{i:06}.dat")))?;
}

Source: src/workloads/unlink_files.rs

checkpoint-scaling — Checkpoint depth scaling (create/read latency vs checkpoint count)
stale (5) 3f0988
why
  • native: user/ or kmod/ changed between 3f0988 and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between 3f0988 and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 3f0988 and c2c43b
  • overlayfs: user/ or kmod/ changed between 3f0988 and c2c43b
  • branchfs: user/ or kmod/ changed between 3f0988 and c2c43b
details

Summary: Checkpoint-depth scaling workload (fixed-size create/read probes).

Fixture: Creates synthetic files under a single workload directory; no external fixture required.

Harness: Uses backend checkpoint protocol between setup phases. Configure with CHECKPOINT_SCALING_MODE={create|read|commit|status} and CHECKPOINT_SCALING_DEPTH=<N>. Checkpoint creation is trivial: 10 seed files are overwritten at each layer.

Execution: Builds a checkpoint chain (overwriting 10 seed files per layer), then measures 100 create or 100 read operations (or exits for commit-time measurement) and emits OpResult.

Source: src/workloads/checkpoint_scaling.rs

checkpoint-scalability
stale (5) ae1f0b
why
  • branchfs: user/ or kmod/ changed between ae1f0b and c2c43b
  • native: user/ or kmod/ changed between d9b397 and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between d9b397 and c2c43b
  • yolo-realistic: user/ or kmod/ changed between d9b397 and c2c43b
  • overlayfs: user/ or kmod/ changed between d9b397 and c2c43b
overwrite-files-100
stale (1) 2fa09a
why
  • yolo-no-perm: user/ or kmod/ changed between 2fa09a and c2c43b
overwrite-files-100k
stale (1) 2fa09a
why
  • yolo-no-perm: user/ or kmod/ changed between 2fa09a and c2c43b
overwrite-files-10k
stale (1) 2fa09a
why
  • yolo-no-perm: user/ or kmod/ changed between 2fa09a and c2c43b
read-files
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between ae1f0b and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between ae1f0b and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ae1f0b and c2c43b
  • overlayfs: user/ or kmod/ changed between ae1f0b and c2c43b
  • branchfs: user/ or kmod/ changed between ae1f0b and c2c43b
rename-files-100
stale (1) 2fa09a
why
  • yolo-no-perm: user/ or kmod/ changed between 2fa09a and c2c43b
rename-files-10k
stale (1) 2fa09a
why
  • yolo-no-perm: user/ or kmod/ changed between 2fa09a and c2c43b
stat-files
stale (5) 39d2f9
why
  • native: user/ or kmod/ changed between ae1f0b and c2c43b
  • yolo-no-perm: user/ or kmod/ changed between ae1f0b and c2c43b
  • yolo-realistic: user/ or kmod/ changed between ae1f0b and c2c43b
  • overlayfs: user/ or kmod/ changed between ae1f0b and c2c43b
  • branchfs: user/ or kmod/ changed between ae1f0b and c2c43b
write-files-100
stale (1) 2fa09a
why
  • yolo-no-perm: user/ or kmod/ changed between 2fa09a and c2c43b
write-files-100k
stale (1) 2fa09a
why
  • yolo-no-perm: user/ or kmod/ changed between 2fa09a and c2c43b
write-files-10k
stale (1) 2fa09a
why
  • yolo-no-perm: user/ or kmod/ changed between 2fa09a and c2c43b

Session Macro-benchmark

dev-workflow — Pinned Linux worktree plus search/edit/build/commit replay of an overlayfs patch series
stale (3) b0769a
why
  • native: user/ or kmod/ changed between b0769a and c2c43b
  • yolo-realistic: user/ or kmod/ changed between b0769a and c2c43b
  • overlayfs: user/ or kmod/ changed between b0769a and c2c43b
details

Summary: Session macrobenchmark that replays a real overlayfs patch series as a search/edit/build/commit workflow on a pinned Linux base commit.

Fixture: Ensures `~/.cache/yolo-bench/linux` exists as the source repo/object store and reuses checked-in workflow fixtures under `bench/fixtures/dev-workflow/`.

Execution: Runs `git worktree add --detach <dest> <base-commit>`, `make tinyconfig`, a clean build, then per-commit search/read/edit command lists, incremental build, git status/diff/add/commit, and a backend-managed checkpoint after each edit command.

Source: src/workloads/dev_workflow.rs

linux-untar — untar a cached Linux source tarball (~80k files)
stale (6) ae1f0b
why
  • overlayfs: user/ or kmod/ changed between ae1f0b and c2c43b
  • yolo-realistic: user/ or kmod/ changed between 72c7b2 and c2c43b
  • native: user/ or kmod/ changed between edc66a and c2c43b
  • yolo-no-perm: could not compare user/ and kmod/ between 2417ba and c2c43b
  • yolo-no-perm: user/ was dirty and is now clean
  • yolo-no-perm: kmod/ was dirty and is now clean
details

Summary: Session macrobenchmark that untars a Linux source release into the mounted destination.

Fixture: Caches one Linux source tarball under ~/.cache/yolo-bench/linux-tar/ and reuses it across runs.

Execution: Runs `tar -xJf <cached-tarball> -C <dest> --strip-components=1`.

Source: src/workloads/linux_untar.rs