Performance Benchmarks
These numbers come from the s3BEAR benchmark harness. The headline result: across 2,680 measured transfers spanning four object sizes and up to 50 concurrent clients, every sample returned correct, complete bytes — zero failures. The presigned data path keeps pace with talking to S3 directly, and the share proxy, after tuning, moves large objects at near-direct throughput.
Throughput is in MiB/s (higher is better); latency is in milliseconds
(lower is better). Percentages in the results table compare each gateway path
against the direct baseline on the same run. This is a single-host,
HTTP-only benchmark — it measures gateway overhead and stability, not
production capacity or a cross-product ranking.
Test methodology
| Setting | Value |
|---|---|
| Hardware | Apple M4 Mac mini · 10 cores · 16 GB RAM |
| Stack | One s3BEAR process · PostgreSQL 16 · MinIO · Docker bridge networking |
| Transport | HTTP, no TLS |
| Database pool | DB_POOL_SIZE=32 · DB_MAX_OVERFLOW=32 |
| Total samples | 2,680 measured targets — 2,680 successful, 0 failed, 0 short |
Download paths measured
- direct — baseline, client talks straight to storage without s3BEAR.
- gateway-presigned — a pre-generated presigned URL (no per-request control plane).
- gateway-presigned-e2e — a permission check and fresh presign on every request.
- gateway-share — token resolution per request; all bytes proxy through s3BEAR.
Measured results
Throughput in MiB/s. The parenthetical percentage is the change versus direct
on the same profile.
| Profile | Direct storage | Presigned data | Presigned E2E | Share proxy | Failed samples |
|---|---|---|---|---|---|
| 1 MiB, c10 final smoke | 619.6 | 595.5 (−3.9%) | 285.0 (−54.0%) | 145.2 (−76.6%) | 0 / 80 |
| 16 MiB, c10, median of 3 | 1935.3 | 1980.9 (+2.4%) | 1588.1 (−17.9%) | 1583.9 (−18.2%) | 0 / 360 |
| 128 MiB, c5 stability run | 1411.7 | 1821.2 (+29.0%) | 1991.3 (+41.1%) | 1339.5 (−5.1%) | 0 / 40 |
| 1 MiB, c50 sharded stress | 558.3 | 475.2 (−14.9%) | 395.9 (−29.1%) | 160.6 (−71.2%) | 0 / 400 |
The pattern is what you'd expect from a gateway: for objects 16 MiB and up, bytes dominate and the presigned data path essentially matches direct storage. For small 1 MiB objects under heavy concurrency, per-request control-plane and proxy work is a larger share of the total, so the fully-proxied share path costs more.
Optimization impact
The share proxy and presigned control plane were the two areas we tuned. Before → after, same hardware:
| Signal | Baseline | Optimized | Change |
|---|---|---|---|
| Share throughput | 480.3 MiB/s | 1583.9 MiB/s | +229.7% |
| Share p95 TTFB | 539.3 ms | 40.1 ms | −92.6% |
| Share p95 total latency | 561.4 ms | 124.8 ms | −77.8% |
| Presigned E2E throughput | 1034.1 MiB/s | 1588.1 MiB/s | +53.6% |
| Presigned E2E control p95 | 118.5 ms | 18.2 ms | −84.7% |
| 1,000-part presign preparation | 183 ms | 92 ms | −49.8% |
Success / failure scorecard
We hold the benchmark to explicit goals and report them honestly — including the targets we haven't fully met yet.
| Goal | Result | Evidence |
|---|---|---|
| Correct, complete responses | PASS | 2,680 / 2,680 measured samples succeeded |
| Presigned data path within 5% of direct | PARTIAL | Passed c10 smoke (−3.9%) and 16 MiB (+2.4%); failed c50 (−14.9%) |
| Presigned E2E control p95 below 100 ms at c50 | PASS | 91.0 ms after DB pool tuning |
| Presigned E2E throughput within 10% of direct for objects ≥16 MiB | FAIL | 82.1% of direct — missing by 7.9 points |
| Large-object share stability | PROVISIONAL PASS | 128 MiB run: zero failures, 94.9% of direct throughput (single run) |
| Small-object share performance at c50 | FAIL | 28.8% of direct, p95 TTFB 546.4 ms |
| Production capacity or cross-product ranking | NOT MEASURED | Single host, HTTP only, no resource limits |
This is a controlled, single-host benchmark over plain HTTP with no resource limits. It is designed to isolate s3BEAR's own overhead and stability — not to predict production capacity, and not to rank s3BEAR against other products. Small-object share throughput at high concurrency, and presigned E2E throughput for large objects, are known areas we're still improving.
Recommended test matrix
To reproduce or extend these runs, the harness sweeps object size against concurrency:
| Object size | Concurrency | Requests per run | Dominant signal |
|---|---|---|---|
| 1 MiB | 1, 10, 50 | 300 | Control plane, TTFB, request rate |
| 16 MiB | 1, 10, 50 | 100 | Typical transfer and concurrency |
| 128 MiB | 1, 10, 25 | 30 | Sustained throughput and backpressure |
| 1024 MiB | 1, 4 | 5 | Long-stream stability and memory |
Related: Architecture · Public Share Links · Image Serving & Transforms · Deployment
