Lockwell home

Benchmarks

The full benchmark ledger as an explorable table. Lockwell vs MinIO with our open harness and with MinIO's own tool (warp), every operation, size, and concurrency, throughput and latency views, the caveats that matter, and the commands that reproduce every row.

Download .md

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

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.

On this page