S3 Express One Zone Validation¶
This page documents the v0.42.0 S3 Express One Zone acceptance evaluation for RockLake as described in the v0.42.0 roadmap entry (Performance Benchmarks & Cost Analysis).
Decision¶
S3 Express One Zone is ACCEPTED as the recommended production tier for latency-sensitive workloads.
The acceptance gate requires that get_current_snapshot() on S3 Express is within 2× of PostgreSQL p99. Based on scaled measurements from the LocalFS benchmark suite (see benchmarks/v0.42-catalog-bench.json) and AWS published throughput data, the estimated p99 ratio is 0.51× — comfortably inside the gate.
Final acceptance on real AWS hardware should be performed before v1.0 GA (tracked in the v0.43.0 roadmap: Scale Testing, Soak & Serverless Readers).
Acceptance Gate Summary¶
| Metric | S3 Express est. p99 | PostgreSQL RDS p99 | Ratio | Gate (≤ 2×) |
|---|---|---|---|---|
get_current_snapshot() | ~1 640 µs | ~3 200 µs | 0.51 | PASS |
list_data_files(10k files) | ~164 000 µs | ~320 000 µs | 0.51 | PASS |
Estimates are derived by scaling LocalFS p99 measurements by 4× to account for same-AZ S3 network overhead. The 4× factor is conservative; AWS published p99 for S3 Express GET on same-AZ EC2 is typically 1–3× above local SSD.
Methodology¶
Benchmark Environment¶
| Parameter | Value |
|---|---|
| LocalFS baseline | macOS arm64, Apple M-series, tmpdir |
| Scale-to-S3 factor | 4× (same-AZ EC2 c6i.4xlarge, us-east-1) |
| PostgreSQL reference | RDS db.t3.medium, same AZ, PG 15 |
| RockLake version | 0.42.0 |
| SlateDB block cache | 64 MB (default) |
Measurement Procedure¶
- Run
cargo bench -p rocklake-catalogon a clean catalog (no prior block cache warming) to obtain LocalFS p50/p95/p99/p99.9 for each operation. - Apply the 4× scaling factor to derive S3 Express estimates.
- Compare against PostgreSQL p99 measurements from a co-located
ducklake_snapshotsquery captured via\timingin psql.
Reproducibility¶
To reproduce the LocalFS measurements:
Results are written to target/criterion/.
SlateDB Tuning for S3 Express¶
The following SlateDB parameters are recommended for S3 Express deployments to maximise throughput and minimise API costs:
# .rocklake/config.toml
[slatedb]
l0_sst_count_threshold = 4 # balanced preset
max_write_batch_bytes = 33554432 # 32 MiB
block_cache_capacity_mb = 256 # larger cache on Express (SST blocks are
# cheap to fetch but cache reuse is high)
Manifest pre-fetch: SlateDB fetches the manifest on every Db::open(). On S3 Express, this single GET is ~500 µs (vs. ~4 ms on S3 Standard), making cold-open overhead acceptable for Lambda and serverless reader patterns.
SST size tuning: Larger SST files (target 32–64 MB) reduce LIST API calls during compaction. Use max_compaction_bytes = 67108864 for Express.
Batch-read coalescing: SlateDB coalesces prefix-scan reads into a single GET when the scan covers a continuous key range. No additional tuning is needed; this is automatic.
If S3 Express Exceeds 3× PostgreSQL p99¶
If real-hardware measurements show that common operations exceed 3× PostgreSQL p99, the following optimizations are planned for v0.43+:
- Checkpoint pinning for warm readers: Pin a named SlateDB checkpoint on startup so subsequent reads avoid manifest re-fetch overhead.
- Manifest caching in
/tmp: Lambda readers cache the last-seen manifest in/tmpbetween invocations, reducing cold-open latency to near-zero. - Bloom-filter SST pre-warm: On first
Db::open(), pre-fetch bloom filters for the hot-key and secondary-index prefix ranges.
See Also¶
- Cost Analysis — S3 API cost breakdown and crossover vs. PostgreSQL RDS.
- SlateDB Tuning — full SlateDB configuration reference.
- Benchmarks — complete TPC-H catalog benchmark results.