Skip to content

Conversation

@gburd
Copy link
Owner

@gburd gburd commented Jul 24, 2025

@gburd gburd force-pushed the rm-freelist branch 20 times, most recently from 3c01069 to 52192b5 Compare July 28, 2025 14:08
@gburd gburd force-pushed the rm-freelist branch 2 times, most recently from ca79be4 to 06ffe4d Compare August 12, 2025 20:01
gburd added 7 commits August 12, 2025 16:57
This set of changes removes the list of available buffers and instead
simply uses the clock-sweep algorithm to find and return an available
buffer.  While on the surface this appears to be removing an
optimization it is in fact eliminating code that induces overhead in the
form of synchronization that is problemmatic for multi-core systems.
This also removes the have_free_buffer() function and simply caps the
pg_autoprewarm process to at most NBuffers.
Combine nextVictimBuffer and completePasses into a single uint64 called
clockSweepCounter so as to eliminate the need for the
buffer_strategy_lock that synchronizes their progression. Increment this
counter atomically by 1 at each tick.  The hand's location is the
counter modulo NBuffers, the number of complete passes is the counter
divided by NBuffers. Overflow of the clockSweepCounter would require ~10
years of continuous operation at ~59 billion ticks per-second, so
unlikely that we consider this to be impossible.
Improve the performance of the buffer manager by replacing the modulo
and division operations with a technique described in the paper
"Division by Invariant Integers using Multiplication" [1]. Our
implementation is inspired by the MIT Licensed "fastdiv" [2].  This
algorithm provides accurate division and modulo in constant time that is
pipeline and ALU friendly and estimated to take about ~12-18 cycles (vs
26-90 for hardware division).  Because our divisor (NBuffers) is fixed
at startup so we need only calculate the constant used by it once.

[1] https://gmplib.org/~tege/divcnst-pldi94.pdf
[2] https://github.com/jmtilli/fastdiv
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants