Skip to content

Benchmarks

Every number on this page comes from a committed evidence run with zero errors in every row, and every harness ships in the repository. Two instruments are used on purpose: our own matrix harness, and warp, MinIO's own benchmark tool, so the comparison cannot hinge on whose ruler was used. Read the caveats before quoting anything; they are part of the result.

Large objects, 64 MiB (2026-06-11)

Two-system run (the reliable configuration: a four-system matrix fights for the same host), AWS SDK Go v2 driver, five iterations per row, sizes and concurrency as labeled. Throughput in MiB/s; ratio is Lockwell over MinIO; p50 latency in milliseconds.

OperationConcurrencyLockwellMinIORatioLockwell p50MinIO p50
PUT12932441.20x219267
PUT1615244773.19x6471832
PUT6416225902.75x24066597
GET1278120181.38x2231
GET161373646592.95x71195
GET64546135461.54x7231120
multipart PUT13032391.27x206264
multipart PUT1610505891.78x9211551
multipart PUT6412875792.22x31666943
multipart COPY1632924657.07x2961995
multipart COPY6425326573.86x15505833
mixed RW1698472.09x54186
mixed RW6479352.23x6421047

LIST and HEAD at 64 MiB: LIST 4.1x to 6.5x in Lockwell's favor across concurrencies; HEAD wins at c1 and c64 and loses narrowly at c16 (0.90x), a transport-bound small-operation path shared by both servers.

Cross-check with MinIO's own tool: warp 1.3.1 (2026-06-12)

warp put, warp get, and warp mixed, identical parameters against both servers on the same stack: 1 MiB objects, 16 concurrent clients, 20 seconds per operation. Zero errors on either side.

warp benchmarkMetricLockwellMinIORatio
putMiB/s256123610.9x
getMiB/s685754541.3x
mixed: GET shareMiB/s262815001.8x
mixed: PUT shareMiB/s8765001.8x
mixed: STAT shareobj/s175210001.8x
mixed: DELETE shareobj/s5853331.8x

The 10.9x PUT figure deserves its own caveat: it is real and reproducible, and a large part of it is the durability tier described below, which warp's small-object PUT pattern amplifies.

Storage footprint

For the identical 44 GiB random (incompressible) write set of the 64 MiB run, measured with block-based du on both data volumes: Lockwell 44.0 GiB, MinIO 81.2 GiB (0.54x). Random data is the worst case for Lockwell's deduplication and compression; on a compressible, duplicated dataset in an earlier validated run (2026-06-04), Lockwell stored 5.15 MiB where MinIO stored 1015.9 MiB.

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.
  • One host. Server and client share a machine (Docker Desktop). Ratios and p50s are the signal; absolute numbers will differ on your hardware, which is why the harnesses ship.
  • MinIO version. Each run pulls minio/minio:latest at run time; the warp run used the image current on 2026-06-12. 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.
  • Zero-error policy. A row with any failed request is discarded and the run repeated. Every row above had zero errors.

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 per-run evidence (transcripts, versions, raw outputs) under bench-results/. The methodology and the regression thresholds the release gates enforce live in docs/benchmark-baselines.md.

Released under the Apache-2.0 License. License