hyper, hyper-parquet: persistent server so hot runs are actually hot#955
Open
caetanosauer wants to merge 1 commit into
Open
hyper, hyper-parquet: persistent server so hot runs are actually hot#955caetanosauer wants to merge 1 commit into
caetanosauer wants to merge 1 commit into
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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