benchmarks: count simulated object store GET requests per query#23803
benchmarks: count simulated object store GET requests per query#23803adriangb wants to merge 2 commits into
Conversation
Registers a CountingObjectStore (stacked under the latency wrapper) that models S3 request counting: one GET per get_opts call, one GET per coalesced range for get_ranges. Also re-chunks streamed local-file GET bodies at 2MiB via ChunkedStore to approximate network transfer granularity. Each query iteration now reports its GET request and byte counts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MGnT9oETcFMydc9cp95HLG
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MGnT9oETcFMydc9cp95HLG
|
run benchmark tpch clickbench_partitioned |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing benchmarks-request-count (6709d58) to 5de7f1d (merge-base) diff using: tpch File an issue against this benchmark runner |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing benchmarks-request-count (6709d58) to 5de7f1d (merge-base) diff using: clickbench_partitioned File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: CPU Details (lscpu)Details
Resource Usagetpch — base (merge-base)
tpch — branch
File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: CPU Details (lscpu)Details
Resource Usageclickbench_partitioned — base (merge-base)
clickbench_partitioned — branch
File an issue against this benchmark runner |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #23803 +/- ##
==========================================
- Coverage 80.71% 80.70% -0.01%
==========================================
Files 1089 1090 +1
Lines 368760 368976 +216
Branches 368760 368976 +216
==========================================
+ Hits 297647 297796 +149
- Misses 53372 53418 +46
- Partials 17741 17762 +21 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Oh this is actually very nice! |
|
Thanks! I was wondering if we could do this for all explain queries and not just for benchmarks like DuckDB does. One complication is that some object stores do internal range coalescing for requests, not sure how these interact. But if you're interested in the idea we can try to push it forward. |
Which issue does this PR close?
None — standalone benchmarking improvement, split out of the bounded-streaming work (apache/arrow-rs#10410).
Rationale for this change
The benchmark harness can simulate object-store latency (
--simulate-latency) but gives no visibility into how many requests a query would issue against a real object store, which is the metric that determines both cost and latency amplification of any change to the parquet fetch path.What changes are included in this PR?
CountingObjectStore: registered under the (optional) latency wrapper for every dfbench run; models S3 request semantics: one GET perget_optscall, and one GET per coalesced range forget_ranges(1 MiB gap merge, followingobject_store::coalesce_ranges), plus requested-byte accounting.object_store::chunked::ChunkedStore(the raw local filesystem streams 8 KiB chunks, which both misrepresents network granularity and is pathologically slow for large streamed ranges).Query 20 iteration 0 took 587.4 ms and returned 110 rows (302 GET requests, 913097581 bytes)Caveat: per-query request counts for TopK queries (e.g. ClickBench Q23) are nondeterministic within a few requests because dynamic row-group pruning races the scan.
Are these changes tested?
Unit test for the coalescing model; exercised across ClickBench/TPC-H/TPC-DS runs.
Are there any user-facing changes?
Benchmark output lines gain request/byte counts. No engine changes.
🤖 Generated with Claude Code
https://claude.ai/code/session_01MGnT9oETcFMydc9cp95HLG