Hi,
On 2024-08-27 11:16:15 -0500, Nathan Bossart wrote:
> (creating new thread from [0])
>
> On Wed, Apr 10, 2024 at 09:52:59PM -0400, Tom Lane wrote:
> > On fourth thought ... the number of tries to acquire the lock, or
> > in this case number of tries to observe the lock free, is not
> > NUM_DELAYS but NUM_DELAYS * spins_per_delay. Decreasing
> > spins_per_delay should therefore increase the risk of unexpected
> > "stuck spinlock" failures. And finish_spin_delay will decrement
> > spins_per_delay in any cycle where we slept at least once.
> > It's plausible therefore that this coding with finish_spin_delay
> > inside the main wait loop puts more downward pressure on
> > spins_per_delay than the algorithm is intended to cause.
> >
> > I kind of wonder whether the premises finish_spin_delay is written
> > on even apply anymore, given that nobody except some buildfarm
> > dinosaurs runs Postgres on single-processor hardware anymore.
> > Maybe we should rip out the whole mechanism and hard-wire
> > spins_per_delay at 1000 or so.
>
> I've been looking at spinlock contention on newer hardware, and while I do
> not yet have any proposal to share for that, I saw this adaptive
> spins_per_delay code and wondered about this possibility of "downward
> pressure on spins_per_delay" for contended locks. ISTM it could make
> matters worse in some cases.
>
> Anyway, I'm inclined to agree that the premise of the adaptive
> spins_per_delay code probably doesn't apply anymore, so here's a patch to
> remove it.
FWIW, I've seen cases on multi-socket machines where performance was vastly
worse under contention with some values of spins_per_delay. With good numbers
being quite different on smaller machines. Most new-ish server CPUs these days
basically behave like a multi-socket machine internally, due to being
internally partitioned into multiple chiplets. And it's pretty clear that that
trend isn't going to go away. So finding a good value probably isn't easy.
We don't have a whole lot of contended spin.h spinlocks left, except that we
have one very critical one, XLogCtl->Insert.insertpos_lck. And of course we
use the same spinning logic for buffer header locks - which can be heavily
contended.
I suspect that eventually we ought to replace all our userspace
spinlock-like-things with a framework for writing properly "waiting" locks
with some spinning. We can't just use lwlocks because support for
reader-writer locks makes them much more heavyweight (mainly because it
implies having to use an atomic operation for lock release, which shows up
substantially).
Greetings,
Andres Freund