Repository navigation
bench: timer extend workload under heartbeat load - #255
Merged
Merged
Conversation
Benchmark gate✅ gate passed
Gated (fails the build): |
lesnik512
force-pushed
the
bench/timer-extend
branch
from
October 26, 2026 15:06
bafeb57 to
1e75362
Compare
lesnik512
force-pushed
the
bench/timer-extend
branch
from
October 26, 2026 15:13
1e75362 to
6ce127c
Compare
This was referenced Oct 26, 2026
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.
Adds
just bench-extend(python -m benchmarks extend). It's a heartbeat workload forpublish(..., timer_conflict="extend"). It isn't gated, and the CI sweep andbaseline.jsondon't change. It measures the extend that #254 added.Workload
timer_idorder so concurrent batches lock rows in the same order. Each transaction takes a connection from a pool of 20.max_fetch_interval=1fires the expired timers.outbox_autovacuum_ddlapplied and autovacuum on. The gated sweep turns autovacuum off on its tables.pg_stat_statements, and the autovacuum count frompg_stat_user_tables.Results
One run, 60 s per point. Apple M2, OrbStack, Postgres 17 at default settings (
synchronous_commiton), one Python client process. The two saturated rows come from reruns after a fix to how the offered rate is computed.The
hotpoints spread the same rate over 60 timers, so pings to one timer collide.Findings
autovacuum_naptime, so dead tuples reached the ping count. At 10,000/s the index grew to 26 MB for 20,000 live rows.Noneand armed no timer. An extend leaves a running timer to its worker: the next ping after the handler finishes inserts a fresh timer, so each one costs at most one expiry. The count only grows once Postgres can't keep up; it was 0 at every point that kept pace.Not measured