Skip to content

Benchmarks

The promoted public matrix is 20260810T105308Z-f3fd294. It ran on the project's Oracle Ampere A1 ARM64 host and contains 51 rows each for Lockwell, MinIO, Garage, and SeaweedFS, zero request errors, and five completed repair/scrub/backup/restore drills. Its generated competitive gate has 20 failures, so the promoted evidence does not support a performance-leadership or provider-replacement claim. The immutable manifest, hashes, raw rows, profile, and gate are in benchmark-baselines/phase1/.

The latest complete unchanged-policy diagnostic is bench-results/20260815T-full-access-log-23194cf, bound to merged 23194cf2dcbc93bad904d1743d82c365f9b4fe4d; it reduced the generated gate to 10 failed checks out of 142 with the same four targets and five drills, but it is not committed or promoted. Until a reviewed run is promoted, the tracked baseline above remains the public release ledger and B-001 remains active.

The explorer below is the historical Lockwell-vs-MinIO presentation dataset. It remains useful for navigating operation, size, concurrency, throughput, and latency dimensions, but it is not the current four-target release ledger. Read the caveats before quoting anything; they are part of the result.

How to read latency Throughput (MiB/s, ops/s) is "how much per second": higher is better. The p50 and p95

views are response times in milliseconds: p50 is the median request, p95 the slow tail, and lower is better. A Lockwell p50 at half of MinIO's means Lockwell answers twice as fast. The Advantage column already does this arithmetic for you, in the right direction, on every view. :::

The ledger

higher is better · advantage column = how many times better Lockwell is on this metric, in either direction

OBJECT SIZE
CONCURRENT CLIENTS
OperationSizeClientsLockwellMinIOAdvantage
put4 KiB13.20 MiB/s0.56 MiB/s5.7x
put4 KiB1617.4 MiB/s4.12 MiB/s4.2x
put4 KiB6410.5 MiB/s9.09 MiB/s1.2x
put1 MiB1155.4 MiB/s38.4 MiB/s4.0x
put1 MiB161,381 MiB/s188.8 MiB/s7.3x
put1 MiB641,622 MiB/s373.5 MiB/s4.3x
put64 MiB1308.1 MiB/s266.0 MiB/s1.2x
put64 MiB161,593 MiB/s598.7 MiB/s2.7x
put64 MiB641,631 MiB/s400.9 MiB/s4.1x
get4 KiB111.3 MiB/s4.53 MiB/s2.5x
get4 KiB1647.3 MiB/s45.7 MiB/s1.0x
get4 KiB6478.5 MiB/s48.0 MiB/s1.6x
get1 MiB1944.5 MiB/s256.9 MiB/s3.7x
get1 MiB168,598 MiB/s3,869 MiB/s2.2x
get1 MiB648,544 MiB/s5,203 MiB/s1.6x
get64 MiB12,858 MiB/s2,460 MiB/s1.2x
get64 MiB1610,889 MiB/s4,733 MiB/s2.3x
get64 MiB645,410 MiB/s3,524 MiB/s1.5x
head4 KiB12,510 ops/s2,298 ops/s1.1x
head4 KiB1611,512 ops/s13,179 ops/s0.9x behind
head4 KiB6423,451 ops/s18,741 ops/s1.3x
head1 MiB13,123 ops/s1,007 ops/s3.1x
head1 MiB1618,111 ops/s20,576 ops/s0.9x behind
head1 MiB6442,878 ops/s43,716 ops/s1.0x behind
head64 MiB13,149 ops/s2,208 ops/s1.4x
head64 MiB1617,290 ops/s20,865 ops/s0.8x behind
head64 MiB6452,432 ops/s14,688 ops/s3.6x
list4 KiB12,001 ops/s524.3 ops/s3.8x
list4 KiB164,095 ops/s1,848 ops/s2.2x
list4 KiB642,737 ops/s464.9 ops/s5.9x
list1 MiB12,076 ops/s1,351 ops/s1.5x
list1 MiB165,114 ops/s2,044 ops/s2.5x
list1 MiB642,699 ops/s564.5 ops/s4.8x
list64 MiB12,067 ops/s1,687 ops/s1.2x
list64 MiB167,024 ops/s1,818 ops/s3.9x
list64 MiB643,661 ops/s503.9 ops/s7.3x
multipart-put64 MiB1222.5 MiB/s232.6 MiB/s1.0x behind
multipart-put64 MiB16985.1 MiB/s413.4 MiB/s2.4x
multipart-put64 MiB641,036 MiB/s532.9 MiB/s1.9x
multipart-copy64 MiB1305.4 MiB/s205.4 MiB/s1.5x
multipart-copy64 MiB163,179 MiB/s325.3 MiB/s9.8x
multipart-copy64 MiB642,300 MiB/s338.9 MiB/s6.8x
mixed-rw4 KiB11,714 ops/s338.0 ops/s5.1x
mixed-rw4 KiB166,549 ops/s2,868 ops/s2.3x
mixed-rw4 KiB647,259 ops/s1,878 ops/s3.9x
mixed-rw1 MiB1316.6 ops/s99.9 ops/s3.2x
mixed-rw1 MiB163,279 ops/s918.6 ops/s3.6x
mixed-rw1 MiB644,074 ops/s1,537 ops/s2.7x
mixed-rw64 MiB110.2 ops/s9.29 ops/s1.1x
mixed-rw64 MiB1692.3 ops/s54.3 ops/s1.7x
mixed-rw64 MiB6481.8 ops/s27.9 ops/s2.9x

on-disk footprint for the identical write set: Lockwell 44.4 GiB vs MinIO 80.4 GiB (0.55x, lower is better)

2026-06-12 · Windows-11-10.0.26200-SP0 · zero errors required in every row (this run: 0) · reproduce: make bench

Caveats

These are part of the result, not footnotes to hide.

  • Durability tier. The bench configuration runs Lockwell in its grouped-durability tier (the write-ahead log is fsynced every 10 ms, not per commit, matching Garage's model; a power loss can cost up to ~10 ms of acknowledged writes). MinIO runs its defaults, which sync per operation. Lockwell's default tier is strict per-commit sync; if your threat model requires it, benchmark that tier instead. This asymmetry flatters Lockwell most on small-object PUT, which is exactly where the warp gap is largest.
  • Current host. The promoted four-target baseline ran server and client containers on one Oracle Ampere A1 ARM64 host (four cores, about 24 GiB RAM). Absolute results are host- and image-specific; the complete profile ships so the matrix can be rerun rather than generalized to unrelated hardware.
  • MinIO version. Each run pulls minio/minio:latest at run time. Version-to-version variance is real, so cross-run comparisons of old tables mix that in.
  • CPU. Lockwell sustains the higher throughput while using more CPU than MinIO at peak. It trades compute for throughput and disk; if you are CPU-bound, weigh that.
  • Failed rows remain visible. The promoted baseline records 20 local-leadership failures across GET, HEAD, LIST, mixed-RW, multipart PUT, and PUT; the latest complete diagnostic records 10. BLOCKERS.md lists the exact tuples, and the generated gate remains authoritative for each artifact. Neither result clears B-001.
  • Storage. Core throughput runs disable compression, deduplication, and encryption for an apples-to-apples engine comparison. Feature-profile storage-efficiency results are separate and must not be substituted for the core matrix.

Neutral hardware

Dev-machine numbers carry dev-machine noise. The standing plan is to run the same two harnesses on a fresh low-cost cloud box (the EUR 5 Hetzner class Lockwell is designed to fit), where nothing else is running, the exact specs are public, and anyone can rent the identical machine and check. scripts/bench-remote-hetzner.sh provisions the server with hcloud, runs make bench and make bench-warp, copies the evidence back, and destroys the box; the dataset selector above grows a new entry whenever such a run lands.

Reproduce

sh
make bench         # the full matrix harness (Lockwell, MinIO, Garage, SeaweedFS)
make bench-warp    # MinIO's warp against Lockwell and MinIO on the same stack

Both write raw per-run evidence under ignored bench-results/. Promote a completed matrix with go run scripts/promote-benchmark-baseline.go ...; only its validated allowlist is committed under benchmark-baselines/phase1/. The historical explorer is regenerated with node website/scripts/build-bench-data.mjs <matrix-dir> <warp-dir>. The methodology and regression thresholds live in docs/benchmark-baselines.md.

Source-available under PolyForm Noncommercial 1.0.0; commercial use requires a written grant. License