hyper, hyper-parquet: persistent server so hot runs are actually hot#955
Conversation
Fixes ClickHouse#936. The shared driver (lib/benchmark-common.sh) calls ./query once per try and, for daemon-backed systems, keeps the server alive across tries so tries 2..N measure hot execution. Hyper's ./query instead opened a brand-new HyperProcess on every call, so each "hot" try hit an empty buffer pool against a just-cache-dropped file: every reported hot time was actually cold. Convert both hyper/ and hyper-parquet/ to the client-server model the framework expects (mirroring umbra/): - start: background a supervisor that opens one long-lived hyperd and publishes its connection descriptor to server.endpoint. In hyper/ it also holds a keep-alive connection to hits.hyper so the buffer pool isn't torn down when each per-try ./query process exits (Hyper detaches a .hyper DB when its last connection closes). - stop: SIGTERM the supervisor (cleanly shutting down hyperd) and wait for it to fully exit so drop_caches isn't defeated by pinned mmap pages. - check / query / load: reconnect to the persistent server via its descriptor instead of spawning their own HyperProcess. Loading through the same server also avoids briefly running two hyperd instances (each claiming ~80% RAM) during the heavy COPY. - benchmark.sh: BENCH_RESTARTABLE=yes (there is now a real daemon whose lifecycle matters) and drop the BENCH_CONCURRENT_DURATION=0 override, re-enabling the concurrent-QPS test. Net effect: the driver's cold cycle (stop -> wait -> drop_caches -> start) gives an honest cold try 1, and tries 2..N hit the warm server = genuinely hot. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
@rschu1ze would you mind taking a look at this? thanks |
|
@rschu1ze Thanks for looking into this! We also have an update to our parquet tests coming soon. Note that I did not update any results as part of the PR, because from what I understand, you guys run the benchmark yourselves nowadays. Is that the case, or should I also include new results as part of the PRs? |
Sure, thanks.
We will run the scripts on our end in any case. But of course you are welcome to run them by yourself (useful e.g. to check for functional problems). So not including results as part of the PRs is fine! |
Fixes #936.
Problem
The shared driver (
lib/benchmark-common.sh) calls./queryonce per try (BENCH_TRIES) and, for daemon-backed systems, keeps the server alive across tries so tries 2..N measure hot execution. Hyper's./queryinstead opened a brand-newHyperProcesson every call, so each "hot" try hit an empty buffer pool against a just-cache-dropped file — every reported hot time was actually cold. (Reported in #936; the same per-query restart was introduced for Hyper in thebenchmark.shsplit refactor.)Fix
Convert both
hyper/andhyper-parquet/to the client-server model the framework expects, mirroringumbra/:startbackgrounds a supervisor that opens one long-livedhyperdand publishes its connection descriptor toserver.endpoint. Inhyper/it also holds a keep-alive connection tohits.hyperso the buffer pool isn't torn down when each per-try./queryprocess exits (Hyper detaches a.hyperDB when its last connection closes).stopSIGTERMs the supervisor (cleanly shutting downhyperd) and waits for it to fully exit sodrop_cachesisn't defeated by pinned mmap pages.check/query/loadreconnect to the persistent server via its descriptor instead of spawning their ownHyperProcess. Loading through the same server also avoids briefly running twohyperdinstances (each claiming ~80% RAM) during the heavy COPY.benchmark.sh:BENCH_RESTARTABLE=yes(there is now a real daemon whose lifecycle matters) and drop theBENCH_CONCURRENT_DURATION=0override, re-enabling the concurrent-QPS test (a single shared server makes it meaningful again).Net effect: the driver's cold cycle (stop → wait → drop_caches → start) gives an honest cold try 1, and tries 2..N hit the warm server = genuinely hot.
Validation
Ran the full 43-query sweep on a c7a-class x86_64 box for both directories:
hyper(native)hyper-parquetEvery query on both paths shows try 1 (cold) ≥ tries 2..3 (hot), with zero anomalies; before the fix all three tries were cold and roughly equal. Native data size (~19 GB) and load time (~351s) match prior committed results. The re-enabled concurrent-QPS test on
hyper-parquetproduced 5.583 QPS at a 0.3% error ratio. No leakedhyperdprocesses afterstop.🤖 Generated with Claude Code