Skip to content

feat(bench): run the random access benchmark against S3 - #9412

Draft
joseph-isaacs wants to merge 4 commits into
developfrom
claude/random-access-s3-benchmark-f9zi6a
Draft

feat(bench): run the random access benchmark against S3#9412
joseph-isaacs wants to merge 4 commits into
developfrom
claude/random-access-s3-benchmark-f9zi6a

Conversation

@joseph-isaacs

@joseph-isaacs joseph-isaacs commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Add random access object store benchmarks

Adds an S3 variant of the random-access benchmark. It is the same benchmark
and the same code paths, only the data is read from an object store instead
of local NVMe:

- `--remote-data-dir s3://bucket/prefix/` opens the Vortex, Parquet and Lance
  files from S3, mirroring the local data directory layout;
- `--prepare-data` materializes the local files (and prints their paths) so
  CI can upload them before the run;
- remote measurements are suffixed `-tokio-s3` and reported with `s3` storage
  so they form a separate series from the local-disk numbers.

CI runs it from a new `pr-bench-random-access-s3.yml` workflow (label
`action/bench-random-access-s3`, also covered by `action/bench-all`) and from
a new `Random Access (S3)` entry in the develop benchmark matrix. The shared
PR benchmark runner gained `remote_data_dir` and `variant_id` inputs; it
uploads the data to a per-run S3 prefix, runs the benchmark against it, and
deletes the prefix afterwards.

Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
@codspeed-hq

codspeed-hq Bot commented Aug 14, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

⚠️ Unknown Walltime execution environment detected

Using the Walltime instrument on standard Hosted Runners will lead to inconsistent data.

For the most accurate results, we recommend using CodSpeed Macro Runners: bare-metal machines fine-tuned for performance measurement consistency.

✅ 2000 untouched benchmarks
⏩ 89 skipped benchmarks1


Comparing claude/random-access-s3-benchmark-f9zi6a (8692404) with develop (b363fb7)

Open in CodSpeed

Footnotes

  1. 89 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Polar Signals Profiling Results

Latest Run

Status Commit Job Attempt Link
🟢 Done 552c49a random-access-bench 1 Explore Profiling Data
Previous Runs (1)
Status Commit Job Attempt Link
🟢 Done 0e297f8 random-access-bench 1 Explore Profiling Data

Powered by Polar Signals Cloud

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Benchmarks: Random Access (S3) 📖

Vortex (geomean): no vortex data
Parquet (geomean): no parquet data

No baseline is available for this benchmark yet; PR measurements are shown without comparison.


random-access / vortex-file-compressed / ns (no group data, 0↑ 0↓)
name PR 552c49a (ns) base none (ns) ratio (PR/base)
random-access/feature-vectors/correlated/vortex-tokio-s3 40152608 no baseline
random-access/feature-vectors/correlated/vortex-tokio-s3-footer 39555573 no baseline
random-access/feature-vectors/uniform/vortex-tokio-s3 113377026 no baseline
random-access/feature-vectors/uniform/vortex-tokio-s3-footer 72760516 no baseline
random-access/nested-lists/correlated/vortex-tokio-s3 38235711 no baseline
random-access/nested-lists/correlated/vortex-tokio-s3-footer 37114619 no baseline
random-access/nested-lists/uniform/vortex-tokio-s3 160272315 no baseline
random-access/nested-lists/uniform/vortex-tokio-s3-footer 161173247 no baseline
random-access/nested-structs/correlated/vortex-tokio-s3 47559363 no baseline
random-access/nested-structs/correlated/vortex-tokio-s3-footer 42867413 no baseline
random-access/nested-structs/uniform/vortex-tokio-s3 167700274 no baseline
random-access/nested-structs/uniform/vortex-tokio-s3-footer 168882790 no baseline
random-access/taxi/correlated/vortex-tokio-s3 98530370 no baseline
random-access/taxi/correlated/vortex-tokio-s3-footer 98107955 no baseline
random-access/taxi/uniform/vortex-tokio-s3 177028795 no baseline
random-access/taxi/uniform/vortex-tokio-s3-footer 177927078 no baseline
random-access/vortex-tokio-s3 52148736 no baseline
random-access/vortex-tokio-s3-footer 48576792 no baseline
random-access / parquet / ns (no group data, 0↑ 0↓)
name PR 552c49a (ns) base none (ns) ratio (PR/base)
random-access/feature-vectors/correlated/parquet-tokio-s3 87454120884 no baseline
random-access/feature-vectors/correlated/parquet-tokio-s3-footer 71792694383 no baseline
random-access/feature-vectors/uniform/parquet-tokio-s3 69803146088 no baseline
random-access/feature-vectors/uniform/parquet-tokio-s3-footer 62652501461 no baseline
random-access/nested-lists/correlated/parquet-tokio-s3 1094628183 no baseline
random-access/nested-lists/correlated/parquet-tokio-s3-footer 1093546696 no baseline
random-access/nested-lists/uniform/parquet-tokio-s3 1094240395 no baseline
random-access/nested-lists/uniform/parquet-tokio-s3-footer 1094400528 no baseline
random-access/nested-structs/correlated/parquet-tokio-s3 514081088 no baseline
random-access/nested-structs/correlated/parquet-tokio-s3-footer 513686077 no baseline
random-access/nested-structs/uniform/parquet-tokio-s3 513941330 no baseline
random-access/nested-structs/uniform/parquet-tokio-s3-footer 513960829 no baseline
random-access/parquet-tokio-s3 542659138 no baseline
random-access/parquet-tokio-s3-footer 542457568 no baseline
random-access/taxi/correlated/parquet-tokio-s3 813555671 no baseline
random-access/taxi/correlated/parquet-tokio-s3-footer 810716993 no baseline
random-access/taxi/uniform/parquet-tokio-s3 1137845440 no baseline
random-access/taxi/uniform/parquet-tokio-s3-footer 864252174 no baseline
random-access / lance / ns (no group data, 0↑ 0↓)
name PR 552c49a (ns) base none (ns) ratio (PR/base)
random-access/feature-vectors/correlated/lance-tokio-s3 33796800 no baseline
random-access/feature-vectors/correlated/lance-tokio-s3-footer 126847870 no baseline
random-access/feature-vectors/uniform/lance-tokio-s3 75246335 no baseline
random-access/feature-vectors/uniform/lance-tokio-s3-footer 150094990 no baseline
random-access/lance-tokio-s3 61337009 no baseline
random-access/lance-tokio-s3-footer 174657105 no baseline
random-access/nested-lists/correlated/lance-tokio-s3 33533056 no baseline
random-access/nested-lists/correlated/lance-tokio-s3-footer 153601899 no baseline
random-access/nested-lists/uniform/lance-tokio-s3 167094709 no baseline
random-access/nested-lists/uniform/lance-tokio-s3-footer 201223109 no baseline
random-access/nested-structs/correlated/lance-tokio-s3 47834502 no baseline
random-access/nested-structs/correlated/lance-tokio-s3-footer 172938882 no baseline
random-access/nested-structs/uniform/lance-tokio-s3 114163859 no baseline
random-access/nested-structs/uniform/lance-tokio-s3-footer 209140837 no baseline
random-access/taxi/correlated/lance-tokio-s3 74303105 no baseline
random-access/taxi/correlated/lance-tokio-s3-footer 181142695 no baseline
random-access/taxi/uniform/lance-tokio-s3 420254028 no baseline
random-access/taxi/uniform/lance-tokio-s3-footer 454587869 no baseline

`lance` is pinned with `default-features = false`, which drops the `aws`
feature it enables by default. Without it Lance has no `s3://` object store
provider registered and opening a remote dataset fails with:

    Invalid user input: No object store provider found for scheme: 's3'

Parquet and Vortex already read from S3 fine; only Lance was affected.

Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
@codecov

codecov Bot commented Aug 14, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.16%. Comparing base (15c73f3) to head (552c49a).
⚠️ Report is 2 commits behind head on develop.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

claude added 2 commits August 14, 2026 17:59
… files

Every synthetic random-access dataset holds 1,000,000 rows and was written
with default writer properties, whose `max_row_group_size` is 1Mi rows. A
million rows never crosses that threshold, so each file is a single row
group. Readers select row groups before rows, so a point lookup fetches and
decodes the entire file: masked by page cache locally, ruinous over an object
store, where one `take` on feature-vectors spends ~87s moving ~4GB.

The tell is in the measurements: nested-lists and nested-structs take the
same time under both access patterns to within 0.04%, because the indices
never change what is read.

Size row groups from the row width instead, targeting 128MiB and clamping to
8-64 batches of 1024 rows. The clamp is what fixes narrow rows: a pure byte
budget would still leave nested-lists in one group. Sizes stay whole
multiples of the 1024-row Arrow batches that `parquet_to_vortex_chunks`
streams, so row group boundaries never split a batch and the derived Vortex
files are unchanged -- only Parquet layout moves. Data pages also drop from
20k to 1024 rows, giving the page index resolution worth having here.

Scan-oriented generators (TPC-H, SpatialBench, PolarSignals, ...) keep large
row groups, which is right for full scans.

This shifts Parquet random-access baselines once, most visibly on the
correlated pattern. Uniform lookups still touch most row groups; only
page-level row selection in the reader addresses those.

Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
`set_max_row_group_size` is deprecated in favour of
`set_max_row_group_row_count`, which takes an `Option<usize>` where `None`
means unlimited. The deprecation warning fails the lint job.

Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants